Spec-Zone.ru › Ada 2012
Руководство по Ada 2012

11.4.1 Пакет исключений

Статическая семантика

Существует следующий пакет библиотеки, определенный языком:
с Ada.Streams;
пакет Ada.Exceptions is
pragma Preelaborate(Exceptions);
тип Exception_Id is private;
pragma Preelaborable_Initialization(Exception_Id);
Null_Id : константа Exception_Id;
функция Exception_Name(Id : Exception_Id) возвращает String;
функция Wide_Exception_Name(Id : Exception_Id) возвращает Wide_String;
функция Wide_Wide_Exception_Name(Id : Exception_Id)
возвращает Wide_Wide_String;
тип Exception_Occurrence is ограниченный private;
pragma Preelaborable_Initialization(Exception_Occurrence);
тип Exception_Occurrence_Access is доступ к всему Exception_Occurrence;
Null_Occurrence : константа Exception_Occurrence;
процедура Raise_Exception(E : входной Exception_Id;
Message : входной String := "")
с No_Return;
функция Exception_Message(X : Exception_Occurrence) возвращает String;
процедура Reraise_Occurrence(X : входной Exception_Occurrence);
функция Exception_Identity(X : Exception_Occurrence)
возвращает Exception_Id;
функция Exception_Name(X : Exception_Occurrence) возвращает String;
-- То же самое, что и Exception_Name(Exception_Identity(X)).
функция Wide_Exception_Name(X : Exception_Occurrence)
возвращает Wide_String;
-- То же самое, что и Wide_Exception_Name(Exception_Identity(X)).
функция Wide_Wide_Exception_Name(X : Exception_Occurrence)
возвращает Wide_Wide_String;
-- То же самое, что и Wide_Wide_Exception_Name(Exception_Identity(X)).
функция Exception_Information(X : Exception_Occurrence) возвращает String;
процедура Save_Occurrence(Target : выходной Exception_Occurrence;
Source : входной Exception_Occurrence);
функция Save_Occurrence(Source : Exception_Occurrence)
возвращает Exception_Occurrence_Access;
процедура Read_Exception_Occurrence
(Stream : не пустой доступ к Ada.Streams.Root_Stream_Type'Class;
Item : выходной Exception_Occurrence);
процедура Write_Exception_Occurrence
(Stream : не пустой доступ к Ada.Streams.Root_Stream_Type'Class;
Item : входной Exception_Occurrence);
для Exception_Occurrence'Read используется Read_Exception_Occurrence;
для Exception_Occurrence'Write используется Write_Exception_Occurrence;
private
... -- не определено языком
конец 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_statement или raise_expression с именем исключения и выражением строки или простым выражением строки, сообщением является выражение строки или простое выражение строки. Для возникновения, вызванного оператором raise_statement или raise_expression с именем исключения, но без выражения строки или простого выражения строки, сообщением является строка, содержащая информацию о возникновении исключения, определённую реализацией. Для возникновения, первоначально вызванного каким-либо другим способом (в том числе по причине сбоя предопределённой языком проверки), сообщением является неопределённая строка. Во всех случаях 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.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API