Н. Джехани - Язык Ада (1988) (1160771), страница 106
Текст из файла (страница 106)
струкции. Данные в равд. 4.5.7 правила определяют случаи, для которых от реализации не требуется возбуждения исключения в случае возникновения ошибочнои ситуации (см. также 11.6). Н()МЕЯ(С ЕЯЯОЯ Описание исключения с несколькими идентификаторами эквивалентно последовательности единичных описаний с одним идентификатором (см.
3.2). Каждое единичное описание исключения задает имя отличного от других исключения. В частности, если настраиваемый модуль содержит описание исключения, то такие описания, неявно сгенерированные различными конкретизациями настройки, ссылаются на разные исключения(но все они имеют один и тот же идентификатор).
Конкретное исключение, обозначенное именем, определяется во время компиляции и является одним и тем же независимо от числа предвыполнений его описания. Следовательно, если описание исключения находится в рекурсивной подпрограмме, то имя исключения обозначает одно и то же исключение для всех вызовов рекурсивной подпрограммы. В языке предопределены следующие исключения.
Они возбуждаются при обнаружении описанных ниже ситуаций. Исключения РНООНАМ ЕЙНОЙ Это исключение возбуждается при попытке вызвать подпрограмму, активизировать задачу или предвыполнить конкретизацию настройки, если тело соответствующего модуля еще не предвыполнено. Оно также возбуждается, если выполнение функции завершается через елд (см. 6.5), при выполнении опе. ратора отбора с ожиданием, когда отсутствует раздел е1ве, а все альтернативы закрыты (см. 9.7.1).
Наконец, в зависимости от реализации исключение может возбуждаться при попытке выполнить ошибочное действие и при некорректной зависимости от порядка (см. 1.6). 8ТОНАОЕ ЕННОН Это исключение возбуждается в одной из следующих ситуа. ций: при вычислении генератора; когда не хватает динамической памяти, выделенной для задачи; когда исчерпана память для набора генерируемых объектов; при предвыполнении элемента описания ипи при вызове подпрограммы, если памяти недостаточно.
ТА8К1МО ЕНЙОН Это исключение возбуждается при возбуждении исключений во время взаимодействия задач (см. 9 и 11.5), Примечание. Описанные выше ситуации могут возникать, не возбуждая соответствующих исключений, если была использована прагма 8ОРРЙЕ88 подавления проверок (см. 11.7). Примеры олисанньщ пользователем исключении: 31МОО1АЯ; ехоояеол; ЕЯЯОЯ: ехоерлоя; ОЧЕЯЕЬОЧЧ, ЦМОЕЯЕЬОЪЧ: ехоевэмл; Ссыпки: вещественный тип 3.5.6, задача 9, идентификатор 2.3, имя 4.1, исключение 11, компонента записи 32, конкретизация 12.3, конкретизация настройки 12.3, набор 3.8, настраиваемое тело 12.2, настраиваемый модуль 12, неявное описание 12.3, обработчик исключения 11.2, объект 3.2, оператор возбуждения 11.3, оператор возврата 5.8, описание 3.1, подпрограмма 6, ссылочное значение 3.8, тело задачи 9.1, тело подпрограммы 6.3.
Контекст исключения СОМБТНА1МТ ЕННОН: агрегат 4.3.1, 4.3.2, атрибут дискретного типа 3.5.5, генератор 4.8, именованная компонента 4.1.3, индекс входа 9.5, индексированная компо. нанта 4.1.1, квалифицированное выражение 4.7, логическая операция 4.5.1, ограничение 3.3.2, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, опе. ратор присваивания 5.2, 5.2.1, операция возведения в степень 4.5.6, описание объекта 3.2.1, отрезок 4.1.2, преобразование типа 4.6, предвыполнение формального параметра настройки 12.3, пустое ссылочное значение 3.8, сопоставление параметров 6.4.1, указание подтипа 3.3.2.
Контекст исключения МОМЕН(С ЕННОН: атрибут дискретного типа 3.5.5, неявное преобразование 3.5.4, 3.5.6, 4.6, операция над числовым типом 4.5, 4.5.7, числовая операция 3.5.5, 3.5.8, 3.5.10. Контекст исключения РНООНАМ ЕЙНОЙ: выход из функции 6.5, контроль предвыполнения 3.9, 7.3, 9.3, 12.2, набор 3.8, некорректная зависимость от порядка 1.6, отбор с ожиданием 9.7.1, ошибочный 1.6, предвыполнение 3.9. Контекст исключения 8ТОНАОЕ ЕННОН: генератор 4.8.
Контекст исключения ТАЗК1МО ЕННОН: активизация задачи 9.3, вызов входа 9.5, 9.7.2, 9.7.3, исключения при взаимодействии задач 11.5, оператор прекращения 9.10. 11.2. ОБРАБОТЧИКИ ИСКЛЮЧЕНИЙ Ответная реакция на одно или несколько исключений определяется обработчиком исключения. обработчик исключения с= апеп выбор исключения ( ) выбор исключения) = > последовательность операторов выбор исключения с= имя исключения ) о(йегв Обработчик исключения помещается в оператор блока, в тело подпрограммы, пакет, заданный модуль или настраиваемый модуль. Каждая иэ указанных в этой главе конструкций Глава 11 называется окружением.
В любом случае окружение обработчиков исключений синтаксически включает следующий раздел: Ьв9!и последовательность операторов ехсербоп обработчик исключения [обработчик исключения) епб Имена исключений, перечисленные во всех выборах данного окружения, должны быть все различны. Выбор исключения об!ага допустим только в последнем обработчике исключения данного окружения как единственный выбор; он задает все исключения, не перечисленные в предыдущих обработчиках окружения, включая исключения, имена которых на месте данного обработчика исключения невидимы. Обработчики исключений в окружении обрабатывают исключения, возбуждаемые при выполнении последовательности операторов этого окружения. Исключения обрабатываются тем обработчиком, в выборах которого заданы имена этих исключений.
Пример: Ьмвл — последовательность операторов агмарпаа айап 3!МОО!Ай ! МОМЕЯ!С Еййбй > РОТГ МАТЙ!Х !3 3!ЙОО!АВ 1; айве а!вагу > РОТ! РАТА!. ЕЯЙОЙ *1; гайе ЕЯВОЯ; епл: Примечание. В каждом обработчике исключений и в последовательностях операторов окружения допустимы одни и те же виды операторов.
Например, оператор возврата допустим в обработчике, если окружение является телом функции. Ссылки: видимость 8.3, имя 4.1, исключение 11, настраиваемое тело 122, настраиваемый модуль 12.1, обработка исключения 11.4, оператор блока 5.6, оператор возбуждения 11.3, оператор возврата 5.8, последовательность операторов 5.1, раздел описаний 3.9, тело задачи 9.1, тело модуля 9, 9.1, тело пакета 7.1, тело подпрограммы 6.3, тело функции 6.3. 11.3.
ОПЕРАТОРЫ ВОЗБУЖДЕНИЯ Оператор возбуждения возбуждает исключение. оператор возбуждения:: = га!аа '!имя исключення1; При выполнении оператора возбуждения с именем исключения возбуждается заданное исключение. Оператор возбуждения беэ имени исключения допустим только внутри обработчика исключения (но не в пооледовательности операторов подпрограммы, пакета, звдачного модуля или настраиваемого модуля, вложенных в данный обработчик); он снова возбуждает то же исключение, которое вызвало переход на обработчик, содержащий данный оператор возбуждения.
Примеры: гейе 3!МОО!АЙ; пкае НОМЕЯ!С ЕЙЯОЙ; — явно воэбухгдается предопределенное исключение гене: — только внутри обработчика исключения Ссылки: задачный модуль 9, имя 4.1, исключение 11, настраиваемый модуль 12, пакет 7, подпрограмма 5.1, последовательность операторов 5.1. 11.4. ОБРАБОТКА ИСКЛЮЧЕНИЙ После возбуждения исключения нормальное выполнение программы прекращается и управление. передается обработчику исключения. Выбор обработчика зависит от места воз.
буждения: при выполнении операторов или при предвыполнении описаний. Ссылки: возбуждение исключения 11.3, исключение 11, обработчик исключения 11.2, оператор 5, описание 3.1, предвыпопнение 3.1, 3.9. ИС1ОВВЕЕЯИЯ 427 11.4.1. ИСКЛЮЧЕНИЯ, ВОЗБУЖДАЕМЫЕ ПРИ ВЫПОЛНЕНИИ ОПЕРАТОРОВ Обработка исключения, возбуждаемого при выполнении последовательности операторов, зависит от того, влохсена ли она в самое внутреннее окружение или в оператор принятия. Случай вложенности в оператор принятия описан в равд. 11.5. Предпринимаемые действия зависят от того, содержит ли данное окружение обработчик этого исключения и возбуждено ли исключение в последовательности операторов окружения или обработчика исключения.
Если некоторое исключение возбуждено в последовательности операторов окружения, содержащего нужный обработчик, то выполнение этой последовательности операторов прекращается и управление передается обработчику данного исключения. Выполнение последовательности операторов обработчика заканчивает выполнение окружения (или предвыполнение, если окружение — тело пакета).
Если исключение возбуждено в последовательности операторов окружения, не содержащего обработчик этого исключения, то выполнение последовательности операторов прекращается. Дальнейшие действия зависят от природы окружения: а) Для тела подпрограммы — то же исключение повторно возбуждается в точке вызова этой подпрограммы, кроме случаев, когда она является главнои программой. Тогда выполнение главной программы прекращается. б) Для оператора блока — то же исключение повторно возбуждается непосредственно после оператора блока (т. е.
в самом вложенном объемлющем окружении или в операторе принятия, содержащем этот оператор блока). в) Для тела пакета, являющегося дополнительным элементом описания, — тоже исключе. ние повторно возбуждается непосредственно после этого элемента описания (в объемлющем разделе описаний]. Если тело этого пакета описано как субмодуль, то исключение повторно возбуждается на месте соответствующего следа тела. Если пакет является библиотечным модулем, то выполнение главной программы прекращается. г) Для тела задачи — задача становится законченной. Говорят, что повторно возбужденное исключение (как это рассмотрено в пп, а), б) и в)) распространяется либо выполнением подпрограммы, либо выполнением оператора блока, либо предвыполнением тела пакета.
В случае тела задачи распространения не происходит. Если окружение является подпрограммой или оператором блока и если оно содержит зависимые задачи, то распространение исключения происходит только после завершения зависимых задач. Наконец, если исключение возбуждено в последовательности операторов обработчика ис.