Spec-Zone.ru › Ada 95
Справочное руководство Ada 95

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

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

Существует следующий пакет стандартной библиотеки языка:

package Ada.Exceptions is
type Exception_Id is private;
Null_Id : constant Exception_Id;
function Exception_Name(Id : Exception_Id) return String;
type Exception_Occurrence is limited private;
type Exception_Occurrence_Access is access all Exception_Occurrence;
Null_Occurrence : constant Exception_Occurrence;
procedure Raise_Exception(E : in Exception_Id;
Message : in String := "");
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 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;
private
... -- не определено языком
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 возвращает параметр Message из Raise_Exception. Для оператора raise с именем исключение, Exception_Message возвращает определённую реализацией информацию о ситуации исключения. Reraise_Occurrence повторно вызывает указанную ситуацию исключения.
Exception_Identity возвращает идентификатор исключения для указанной ситуации.
Функции Exception_Name возвращают полное развернутое имя исключения, заглавными буквами, начиная с корневого блока библиотеки. Для исключения, объявленного непосредственно внутри пакета Standard, возвращается идентификатор. Результат является определённым реализацией, если исключение объявлено внутри безымянного блока.
Exception_Information возвращает определённую реализацией информацию о ситуации исключения.
Raise_Exception и Reraise_Occurrence не имеют эффекта в случае Null_Id или Null_Occurrence. Exception_Message, Exception_Identity, Exception_Name и Exception_Information вызывают Constraint_Error для Null_Id или Null_Occurrence.
Процедура Save_Occurrence копирует Source в Target. Функция Save_Occurrence использует оператор выделения типа Exception_Occurrence_Access для создания нового объекта, копирует Source в этот новый объект и возвращает значение доступа, обозначающее этот новый объект; результат может быть удалён с помощью экземпляра Unchecked_Deallocation.

Требования к реализации

Реализация свойства Write (см. 13.13.2) для 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.


Spec-Zone.ru

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