Cтраница 3
Напишите программу на C, которая использует многоуровневую иерархию наследования классов исключения для создания ситуации, в которой важна последовательность обработчиков исключений. [31]
После генерации исключение будет перехвачено ближайшим обработчиком исключений ( ближайшим к блоку try, в котором было сгенерировано исключение), содержащим спецификацию соответствующего типа. Обработчики исключений для блока try перечисляются сразу после него. [32]
Обработка исключений используется в случаях, при которых система может быть восстановлена для нормальной работы после ошибки, вызвавшей исключение. Процедура восстановления называется обработчиком исключения. [33]
Предположите, что программа генерирует исключение и начинает выполняться соответствующий обработчик. Теперь предположите, что обработчик исключения сам генерирует такое же исключение. Создает ли это бесконечную рекурсию. [34]
Генерируемый объект обычно является строкой символов ( для сообщения об ошибке) или объектом классом. Генерируемый объект передает информацию обработчику исключения. [35]
Для автоматического вызова обработчиков исключений каждый оператор может сопровождаться частью исключений, представляющей собой список пар имя исключения, имя обработчика, указывающих имена обработчиков, которые должны вызываться при возникновении указанных исключений. В Аде принят более простой вариант: обработчик исключений помещается непосредственно в конце блока. Если во время исполнения некоторого оператора возбуждается исключение, то его обработчик ищется в части исключений данного или окружающего оператора. При отсутствии обработчика возбуждается специальное исключение fail, которое, как правило, ведет к останову программы. [36]
Когда в транзакции Т возбуждается исключение ( создается экземпляр соответствующего класса), то вызвавшая ее программа должна решать, каким образом его обрабатывать. Это осуществляется спецификацией специальных сложных свойств - обработчиков исключений - у которых субъектами являются выражение Е и экземпляр исключения ЕХС, а с-значением - обрабатывающая исключение транзакция Th. Когда во время вычисления Е возбуждается исключение ЕХС, вызывается Th с этим исключением в качестве аргумента. Предположим для примера, что транзакция АКТИВ во время своей работы вызывает транзакцию ЗАРЕЗЕРВИРОВАТЬ-МЕСТО. [37]
В процессе генерации исключения создается и инициализируется временная копия операнда throw. Этот временный объект затем инициализирует параметр в обработчике исключения. Временный объект уничтожается, когда завершается выполнение обработчика исключения и управление передается программе. [38]
Из приведенной последовательности действий видно, что если при исполнении защищенного блока не произошло ошибки, то блок exept не выполняется. В случае же возникновения ошибки внутри защищенного блока управление передается в обработчик исключений, а после обработки исключительной ситуации не возвращается в защищенный блок. Поясним это следующими примерами. [39]
Блоки try и catch размещаются в наиболее удобном уровне программы. Включение больших объемов кода в один блок try позволяет уменьшить число обработчиков исключений. [40]
За блоком try может не следовать ни одного блока catch, или может следовать несколько таких блоков. Если при выполнении блока try не генерируется ни одно исключение, все обработчики исключений пропускаются и управление передается первому оператору после последнего обработчика. [41]
Что происходит, когда исключение возникает в обработчике исключения. Первоначальное исключение, которое было перехвачено, формально считается обработанным в тот момент, когда начинает выполняться обработчик исключения. Так что исключения, возникающие в обработчике, должны обрабатываться вне того блока try, в котором было сгенерировано первоначальное исключение. [42]
Обработчики исключений, следующие за блоком try, напоминают оператор switch. Интересно, что в данном случае нет необходимости использовать break, чтобы выйти из обработчика, пропуская остающиеся обработчики исключений. Каждый блок catch определяет отличную от других область действия, в то время как все случаи в операторе switch находятся внутри общей области действия этой структуры. [43]
![]() |
Некоторые классы исключений. [44] |
Соответствующий обработчик исключения сообщает пользователю о сделанной ошибке и советует повторить ввод. [45]