Руководство по Ada (Ada 2022)
11.4.1 Пакет исключений
Статическая семантика
Существует следующий пакет библиотеки, определённый языком:
with Ada.Streams;
package Ada.Exceptions
with Preelaborate, Nonblocking, Global => in out synchronized is
type Exception_Id is private
with Preelaborable_Initialization;
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
with Preelaborate, Nonblocking, Global => in out synchronized is
type Exception_Id is private
with Preelaborable_Initialization;
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
with Preelaborable_Initialization;
type Exception_Occurrence_Access is access all Exception_Occurrence;
Null_Occurrence : constant Exception_Occurrence;
with Preelaborable_Initialization;
type Exception_Occurrence_Access is access all Exception_Occurrence;
Null_Occurrence : constant Exception_Occurrence;
procedure Raise_Exception(E : in Exception_Id;
Message : in String := "")
with No_Return;
function Exception_Message(X : Exception_Occurrence) return String;
procedure Reraise_Occurrence(X : in Exception_Occurrence);
Message : in String := "")
with No_Return;
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;
Каждое уникальное исключение представлено отдельным значением типа 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 с именем исключения и выражением строки или простым выражением строки, сообщением является выражение строки или простое выражение строки. Для вспышки, вызванной оператором 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 восстанавливает вспышку исключения из потока (включая поток, записанный в другом разделе).
Параграф 16 был удалён.
Разрешения реализации
Реализация 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.
ПРИМЕЧАНИЕ Кодировка UTF-8 (см. A.4.11) может использоваться для представления символов, не входящих в ASCII, в сообщениях об исключениях.