Н. Джехани - Язык Ада (1988) (1160771), страница 38
Текст из файла (страница 38)
Повторное возбуждение исключения При возникновении исключения выполнение программы не продолжается с той точки, в которой возбуждено исключение. Вместо оставшейся части блока, подпрограммы или задачи, в которой появилось исключение, выполняется соответствующий обработчик исключения; если обработчик исключения не указан, то выполнение блока, подпрограммы или задачи, в которой появилось исключение, прекращается. Тем не менее оператор, в котором возникло исключение, может быть выполнен повторно, если оператор вложить в блок с локальным обработчиком исключения, а сам блок поместить в цикл.
Иногда ошибки (т. е. исключения) при взаимодействии с устройствами ввода и вывода, такими как накопители на магнитных лентах, вызываются кратковременными нарушениями, например шумами в сети. В этих случаях часто бывает достаточно повторно запустить невыполненную операцию через некоторое время. В других случаях может быть желательно повторить операцию после того, как обработчик исключения исправит некоторые условия, которые могли вызвать исключение. Например, некоторая операция может привести к возникновению исключения БТОКАОЕ ЕККОК, потому что нет свободной памяти.
Операция повторяется после освобождения памяти в обработчике исключения или после сборки мусора. Следующий фрагмент [1СН80] иллюстрирует попытку прочитать ленту !О раз, прежде чем отказаться от дальнейшего чтения. -- в случае возникновения ошибки, ленту пытаются прочитать еще раз, -- но после !О раз отказываются от подобных попыток Рог! 1п 1..10 !оор Ьей!и КЕАзз ТАРЕ(ВЬОСК); ехзе -- подходящее использование оператора выхода ехеербоп згЬеп ТАРЕ ЕККОК ) и 1 !0 ФЬеп га!ве ТАРЕ )ЗК1ЧЕ МАЬРЬ)ХСТ!ОХ; е1ее ВАСК БРАСЕ; — возврат к началу последнего блока епб И; епб; епд 1оор; тйй Исключении 5.8.
Блокировка исключений 111.71 ргайгва Я)РРзчЕВВ (имя проверки [, 1О(ч( 1 имя1); Второй параметр является объектом или именем типа, для которого проверка должна подавляться. Если второй параметр опушен, то проверка будет подавлена во всех компонентах, содержащих прагму. Проверки, которые можно подавить, и соответствующие исключения приведены в таблице. Возмоягпое агключепаа Подавлвппая проверка Ошибка ограничения (СОГСЯТКА!Г(Т ЕККОК) Проверка ссылки Проверка днскриминанта Проверка индекса ПРоверка длины Проверка диапазона Числовая ошибка ((Ч()МЕК)С ЕККОК) Проверка деления ПРовеРка переполнения ПРограммная ошибка (РКООКАМ ЕККОК) Проверка предвыпоянения Ошибка памяти (бтОкАОе еккОк) Проверка памяти 5.9. Примеры В этом разделе рассматриваются примеры, иллюстрирующие обработку исключений, которые встречаются в пакетах, подпрограммах и задачах.
Первый пример демонстрирует использование исключений для модификации пакета Р(ГО П Следовательно, наличие прагмы Я)РРКЕЕЗ не гарантирует, что соответствующее исключение не будет возбуждено. Прим. Ред. Обычно при возникновении исключений они возбуждаются автоматически, но возбуждение некоторых предопределенных исключений может быть подавлено, если компилятору данп указание не проверять некоторые условия (например, деление на нуль или неинициализированные переменные). Прагма В1)РРКЕЯЯ используется для подавления проверок.
Компилятор может игнорировать прагму Я)РРзчЕВЯ, если подавление проверки невозможно или оно стоит слишком дорого". Подавление проверок может привести к программе, которая будет выполняться быстрее и использовать меньше памяти, так как код для выполнения проверок не будет вставляться в программу.
Например, код для проверки, являются ли индексы массива правильными или нет, может быть опушен, если подавляется проверка 1(ч(гзЕХ СНЕСК. Пользователь должен быть очень осторожным, особенно в ответственных случаях, лри многочисленных подавлениях проверок. Проверки могут быть подавлены только после гарантии того, что соответствующие условия не возникнут во время выполнения программы. Областью видимости подавления проверок является блок, тело подпрограммы, пакета или задачи, в описательной части которой появляется прагма ЯзРРзчЕЯЯ.
Прагма В1)РРКЕБВ имеет форму Главв в (гл. 3) для обработки граничных условий. Следующий пример показывает различия в обработке исключений в итеративной и рекурсивной программах вычисления факториала. Еще два примера объясняют использование обработки исключительных ситуаций в задачах предупреждения пожара в доме и управления ядерным реактором для защиты его от перегрева или переохлаждения. Пример слияния двух отсортированных файлов иллюстрирует использование исключений при файловой обработке, т.
е. как обработка исключения влияет на завершение работы программы и каким образом устанавливается соответствие между операцией возбуждения и предопределенным исключением. Следующий пример показывает возможность составления подпрограмм для выражения своих «последних желаний» перед их завершением из-за возникновения исключения.
Наконец, последний пример программы синтаксического анализа описывает использование определенного пользователем исключения для завершения выполнения ее работы, когда дальнейшая обработка является нецелесообразной. 5.9.1. Пакет ЕЛО (из примера гл. 3 о мнолсестве очередей с приоритетами) Задача заключается в том, чтобы модифицировать пакет НРО таким образом, чтобы при попытке добавления нового элемента к заполненной очереди или при попытке удаления элемента из пустой очереди происходило возбуждение соответствующего исключения.
Для обработки подобных граничных условий в пакете НРО проведем следующие изменения: 1. Исключения НП.Ь и ЕМРТУ опишем в спецификации НРО. 2. В процедурах (< АРО и О Г1йБТ условные операторы, печатающие сообщения о состоянии очереди, заменим условными операторами, возбуждающими соответствующие исключения. Например, условный оператор !1 Я.С1)В 31ЕЕ МАХ $1г.Е !Ьев Р()Т («ОШИБКА: очередь полна»); 1<(Е%/ 1,1)ч Е; ге!вгп; енв !1; в О АР(З заменим на условный оператор Ы'Я.С(Ж 31УЕ МАХ $1к,Е гЬев га!яе ИЛЛ.; ев<$ !1; Обработка исключений НРО.НЛЛ. и НРО.ЕМРТУ для стека НГО (пакета РК1Ой1ТУ (6)Е()ЕБ в данном случае)„конечно, возлагается на пользователя.
Например, процедуру АОР в теле пакета Рй!Ой1Тз' ЯОЕ()ЕЯ ргвееввге А1))З(Р: !в РВ1ОВ1ТУ; 1: !в 1ОВ 1Р) !в Ьей!в 0 А1))З(РЯ(Р), 1); ев<1 А(з)З; Исключения пользователь должен заменить на ргосеннге АМ)(Р: !в РК1ОК1ТУ; У: !п )ОВ Ю) 1в Ье(!!а О А1)О(Р О(Р), 1); ехсербоп иЬеа РОЬЬ > -- принять меры для обработки случая, — если очередь полна еао АОР; 5.9.2. Факториал Требуется написать функцию для вычисления факториала числа и (и > О). Значение факториала часто является очень большой величиной, поэтому при возбуждении исключения ХУМЕК1С ЕККОК функция должна возвращать наибольшее значение типа 1ХТЕОЕК. Итеративный вариант вычисления функции ГАСТ 1ТЕК следующий: Вшсбоп ГАСТ 1ТЕК(Х: ХАТ1)КАЬ) гепвп 1ХТЕОЕК !я РАСТ: 1ХТЕОЕК: 1; Ье(!!в 1ог 1!а 2..Х !оор РАСТ: РАСТ Я 1; сад 1оор; гевав РАСТ; ехсерВов ггЬеп Х()МЕК1С ЕККОК > ге!ага 1ХТЕОЕК'ЬАБТ; еш! РАСТ 1ТЕК; Рекурсивный вариант для функции факториала РАСТ КЕС имеет вид йшс!!оа РАСТ КЕС(Х: ХАТ()КАЬ) гении 1ХТЕОЕК !я Ье!ра !1Х -0 гЬев гение 1; е!яе гевпв Х ° РАСТ КЕС(Х вЂ” !); ° а!1; ехсерг!ов ггЬеа ХЫМЕК1С ЕККОК > гешга 1ХТЕОЕК'ЬАЗТ; евд РАСТ КЕС; В итеративном и рекурсивном вариантах вычисления функции факториала возбуждение и обработка исключений будут различными.
В случае РАСТ 1ТЕК при возникновении переполнения происходит возбуждение исключения ХУМЕК1С ЕККОК, вызывающее завершение выполнения основной части программы и возврат 1ХТЕОЕК'ЬАБТ через обработчик исключения. В случае ГАСТ КЕС, как только возникает переполнение, текущая конкретизация РАСТ-КЕС завершается со значением 1ХТЕОЕК'ЬАВТ, полученным преды- Глава б душей активизацией. Если переполнение возникает еше раз, то вновь происходит возбуждение исключения )ч!1)МЕК1С ЕККОК. Возбуждение исключения происходит каскадно до первой активизации, которая в конечном счете и возвращает 1)ч(ТЕОЕК'ЬАЯТ как факториал числа )х!.
В итеративном варианте вычисления функции факториала исключение (ч(ОМЕК1С ЕККОК возбуждается не более одного раза, в то время как в рекурсивном случае исключение может быть возбуждено несколько раз'!. 5.9.3. Управление ядерным реактором Задача заключается в том, чтобы спроектировать задачу ЧЕЯБЕЬ МО)Ч1ТОК, осуществляющую управление температурой стен камеры сжатия ядерного реактора. Эта задача начинает управлять камерой сжатия (т. е. становится активной) только после запуска задачи, названной БТАКТ КЕАСТОК, когда как в камере сжатия установится температура, величина которой будет находится около оптимальной Т ОРТ. Температура камеры сжатия должна поддерживаться между Т М1)х! и Т МАХ и по возможности поддерживаться около Т ОРТ(Т М11ч < < Т-ОРТ < Т МАХ).
Если температура камеры сжатия выходит за зти пределы, то реактор сразу же необходимо остановить, а затем выяснить, что произошло. Температура камеры сжатия может быть увеличена или уменьшена на величину ОЕЬТА Т путем уменьшения или увеличения потока охладителя через иее на величину 1зЕЬТА Е Ббльшие изменения температуры камеры сжатия можно получить за счет пропорционального увеличения или уменьшения потока охладителя. Пакет РКЕББ()КЕ ЧЕББЕЬ используется для того, чтобы управлять потоком охладителя вокруг камеры сжатия, считывая самое последнее значение температуры камеры сжатия и т.