Справочник по Ada 2005
11.4.1 Пакет исключений
Статические семантики
Существует следующий пакет библиотеки, определённый языком:
with Ada.Streams;
package Ada.Exceptions is
pragma Preelaborate(Exceptions);
type Exception_Id is private;
pragma Preelaborable_Initialization(Exception_Id);
Null_Id : constant Exception_Id;
function Exception_Name(Id : Exception_Id) return String;
function Wide_Exception_Name(Id : Exception_Id) return Wide_String;
function Wide_Wide_Exception_Name(Id : Exception_Id)
return Wide_Wide_String;
package Ada.Exceptions is
pragma Preelaborate(Exceptions);
type Exception_Id is private;
pragma Preelaborable_Initialization(Exception_Id);
Null_Id : constant Exception_Id;
function Exception_Name(Id : Exception_Id) return String;
function Wide_Exception_Name(Id : Exception_Id) return Wide_String;
function Wide_Wide_Exception_Name(Id : Exception_Id)
return Wide_Wide_String;
type Exception_Occurrence is limited private;
pragma Preelaborable_Initialization(Exception_Occurrence);
type Exception_Occurrence_Access is access all Exception_Occurrence;
Null_Occurrence : constant Exception_Occurrence;
pragma Preelaborable_Initialization(Exception_Occurrence);
type Exception_Occurrence_Access is access all Exception_Occurrence;
Null_Occurrence : constant Exception_Occurrence;
procedure Raise_Exception(E : in Exception_Id;
Message : in String := "");
pragma No_Return(Raise_Exception);
function Exception_Message(X : Exception_Occurrence) return String;
procedure Reraise_Occurrence(X : in Exception_Occurrence);
Message : in String := "");
pragma No_Return(Raise_Exception);
function Exception_Message(X : Exception_Occurrence) return String;
procedure Reraise_Occurrence(X : in Exception_Occurrence);
function Exception_Identity(X : Exception_Occurrence)
return Exception_Id;
function Exception_Name(X : Exception_Occurrence) return String;
-- То же, что и Exception_Name(Exception_Identity(X)).
function Wide_Exception_Name(X : Exception_Occurrence)
return Wide_String;
-- То же, что и Wide_Exception_Name(Exception_Identity(X)).
function Wide_Wide_Exception_Name(X : Exception_Occurrence)
return Wide_Wide_String;
-- То же, что и Wide_Wide_Exception_Name(Exception_Identity(X)).
function Exception_Information(X : Exception_Occurrence) return String;
return Exception_Id;
function Exception_Name(X : Exception_Occurrence) return String;
-- То же, что и Exception_Name(Exception_Identity(X)).
function Wide_Exception_Name(X : Exception_Occurrence)
return Wide_String;
-- То же, что и Wide_Exception_Name(Exception_Identity(X)).
function Wide_Wide_Exception_Name(X : Exception_Occurrence)
return Wide_Wide_String;
-- То же, что и Wide_Wide_Exception_Name(Exception_Identity(X)).
function Exception_Information(X : Exception_Occurrence) return String;
procedure Save_Occurrence(Target : out Exception_Occurrence;
Source : in Exception_Occurrence);
function Save_Occurrence(Source : Exception_Occurrence)
return Exception_Occurrence_Access;
Source : in Exception_Occurrence);
function Save_Occurrence(Source : Exception_Occurrence)
return Exception_Occurrence_Access;
procedure Read_Exception_Occurrence
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out Exception_Occurrence);
procedure Write_Exception_Occurrence
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in Exception_Occurrence);
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : out Exception_Occurrence);
procedure Write_Exception_Occurrence
(Stream : not null access Ada.Streams.Root_Stream_Type'Class;
Item : in Exception_Occurrence);
for Exception_Occurrence'Read use Read_Exception_Occurrence;
for Exception_Occurrence'Write use Write_Exception_Occurrence;
for Exception_Occurrence'Write use Write_Exception_Occurrence;
private
... -- не указано языком
end Ada.Exceptions;
... -- не указано языком
end Ada.Exceptions;
Каждый отличительный тип исключения представляется distinct значением типа Exception_Id. Null_Id не представляет ни одно исключение и является значением по умолчанию типа Exception_Id. Каждое возникновение исключения представляется значением типа Exception_Occurrence. Null_Occurrence не представляет ни одно возникновение исключения и является значением по умолчанию типа Exception_Occurrence.
Для префикса E, обозначающего исключение, определено следующее свойство:
E'Identity
E'Identity возвращает уникальный идентификатор исключения. Тип этого свойства - Exception_Id.
Raise_Exception вызывает новое возникновение идентифицированного исключения.
Exception_Message возвращает сообщение, связанное с данным Exception_Occurrence. Для возникновения, вызванного вызовом Raise_Exception, сообщением является параметр Message, переданный Raise_Exception. Для возникновения, вызванного оператором raise с именем исключения и выражением строки, сообщением является выражение строки. Для возникновения, вызванного оператором raise с именем исключения, но без выражения строки, сообщением является строка, содержащая информацию, определённую реализацией об этом возникновении исключения. Во всех случаях Exception_Message возвращает строку с нижней границей 1.
Reraise_Occurrence повторно вызывает указанное возникновение исключения.
Exception_Identity возвращает идентификатор исключения возникновения.
Функции Wide_Wide_Exception_Name возвращают полное расширенное имя исключения, в верхнем регистре, начиная с корневого модуля библиотеки. Для исключения, объявленного непосредственно в пакете Standard, возвращается определяющий идентификатор. Результат определён реализацией, если исключение объявлено внутри неопределённого блока.
Функции Exception_Name (соответственно, Wide_Exception_Name) возвращают ту же последовательность графических символов, что и Wide_Wide_Exception_Name, если все графические символы определены в Character (соответственно, Wide_Character); в противном случае последовательность символов определяется реализацией, но не короче, чем та, которая возвращается Wide_Wide_Exception_Name для того же значения аргумента.
Строка, возвращаемая функциями Exception_Name, Wide_Exception_Name и Wide_Wide_Exception_Name, имеет нижнюю границу 1.
Exception_Information возвращает информацию, определённую реализацией, об возникновении исключения. Возвращаемая строка имеет нижнюю границу 1.
Reraise_Occurrence не имеет эффекта в случае Null_Occurrence. Raise_Exception и Exception_Name вызывают Constraint_Error для Null_Id. Exception_Message, Exception_Name и Exception_Information вызывают Constraint_Error для Null_Occurrence. Exception_Identity, применённая к Null_Occurrence, возвращает Null_Id.
Процедура Save_Occurrence копирует Source в Target. Функция Save_Occurrence использует выделение типа Exception_Occurrence_Access для создания нового объекта, копирует Source в этот новый объект и возвращает значение доступа, обозначающее этот новый объект; результат может быть удалён с помощью экземпляра Unchecked_Deallocation.
Write_Exception_Occurrence записывает представление возникновения исключения в поток; Read_Exception_Occurrence восстанавливает возникновение исключения из потока (включая записанное в другом разделе).
Требования к реализации
Этот абзац был удалён.
Разрешения реализации
Реализация Exception_Name в среде с ограниченным пространством может вернуть определяющий идентификатор вместо полного расширенного имени.
Строка, возвращаемая процедурой Exception_Message, может быть усечена (до не менее 200 символов) процедурой Save_Occurrence (не функцией), процедурой Reraise_Occurrence и оператором повторного вызова.
Рекомендации по реализации
Exception_Message (по умолчанию) и Exception_Information должны генерировать информацию, полезную для отладки. Exception_Message должен быть коротким (около одной строки), тогда как Exception_Information может быть длинным. Exception_Message не должен содержать Exception_Name. Exception_Information должен содержать как Exception_Name, так и Exception_Message.