Rationale for Ada 2005: Exceptions, generics etc
RUSTOPBACKNEXT
ENG |
2. Exceptions
@ There are two minor improvements in this area. @ One concerns the detection of a null exception occurrence which might be useful in a routine for analysing a log of exceptions. This is tricky because although a constant Null_Occurrence is declared in the package Ada.Exceptions, the type Exception_Occurrence is limited and no equality is provided. So the obvious test cannot be performed. @ We can however apply the function Exception_Identity to a value of the type Exception_Occurrence and this returns the corresponding Exception_Id. Thus we could check to see whether a particular occurrence X was caused by Program_Error by writing
|
|
|
|
|
|
|
|
Rationale for Ada 2005: Exceptions, generics etc
@ENGRUSTOPBACKNEXT2. Исключения
@ Есть два небольших усовершенствования этой области.
@ Первое касается обнаружения нулевого вхождения исключения, которое могло бы быть полезным в подпрограмме для анализа журнала регистрации исключений. Это является хитрым потому что, хотя константа Null_Occurrence объявлена в пакете Ada.Exceptions, тип Exception_Occurrence является ограниченым и следовательно не поддерживает никакое равенство. Таким образом, очевидный тест не может быть выполнен.
@ Мы можем, однако, применить функцию Exception_Identity к значению типа Exception_Occurrence которая возвращает Exception_Id. Таким образом, мы можем выяснить, было ли специфическое вхождение X вызвано Program_Error при написании:
|
@ Однако, в Аде 95 при попытке применить Exception_Identity к значению Null_Occurrence возникает исключение Constraint_Error, и таким образом, мы должны прибегнуть к некоторой уловке объявляя функцию следующим образом:
|
@ Мы можем теперь написать некоторую общую подпрограмму анализа так:
|
@ Но обнаружение Constraint_Error в Is_Null_Occurrence - плохая практика, так как остаётся опасность пропустить какую-нибудь другую ошибку. Соответственно, в Аде 2005 Exception_Identity возвращает Null_Id когда имеется Null_Occurrence. Таким образом, мы можем теперь обойтись без изворотливой функции Is_Null_Occurrence и написать:
|
@ Остерегайтесь того что теперь у нас есть несовместимость между Адой 95 и Адой 2005, так как противная функция Is_Null_Occurrence в Аде 2005 будет всегда возвращать False.
@ Заметим, что также возбуждается исключение Constraint_Error если любая из трех функций Exception_Name, Exception_Message, или Exception_Information применена к значению Null_Occurrence, таким образом, подобное поведение с Exception_Identity в Аде 95 возможно понятно на первый взгляд.
@ Однако, полагается, что это не было специальным намерением разработчиков языка, а появилось по ошибке.
@ Фактически изменение, описанное здесь, было первоначально классифицировано как исправление к Аде 95, но позже повторно классифицировано как поправка, чтобы привлечь больше внимания к этому из-за потенциальной несовместимости.
@ Другое изменение в области исключений касается оператора raise. Теперь возможно (опционально, конечно) выдавать сообщение таким образом:
|
@ Такая форма введена для удобства и идентична написанию:
|
@ Нет никакого изменения к форме оператора raise без исключения, которое просто повторно поднимает существующее вхождение.
@ Отметьте различие между:
|
@ и
|
@ В первом случае последующий вызов Exception_Message возвращает определённую реализацией информацию об ошибке, тогда как во втором случае оно просто возвращает данное сообщение, которое в этом примере является пустой строкой.
@ Небольшое изменение к процедуре Raise_Exception упомянуто в Секции 4 ниже.
@ В пакете Ada.Exceptions появились также дополнительные функции Wide_String и Wide_Wide_String возвращающие имя исключения. Они имеют идентификаторы Wide_Exception_Name и Wide_Wide_Exception_Name и перезагружены, чтобы взять параметр типа Exception_Id или Exception_Occurrence. Нижняя граница строк, возвращенных этими функциями и существующими функциями Exception_Name, Exception_Message и Exception_Information равна 1 (еденице) (В Аде 95 забыли указать это для существующих функций). Читатель напомнит, что подобные дополнительные функции (без последействий) в пакете Ada.Tags были упомянуты в статье посвящённой объектно-ориентированной модели.
2010-10-24 00:26:56
. .