Структурированная обработка ошибок
В объектной модели языка Паскаль введено понятие исключений– ошибоквремени выполнения, которые могут возникать как при некорректных действиях пользователя, так и в случае неудачного выполнения различных действий (файловых операций, запроса ресурсов операционной системы и т.д.). Средства обработки исключений позволяют упростить задачу корректного выхода из подпрограмм, их вызвавших.
Базовым классом для всех исключений является TException. Объект исключениясодержит информацию о типе исключения, например, деление на ноль (класс EZeroDivide), недостаточность системных ресурсов (класс EOutOfMemory), ошибка ввода-вывода (класс EInOutError). Разветвленная структура исключений позволяет фиксировать только интересующие типы. Например, ошибки переполнения или деления на ноль относятся к классу EMathError. Поэтому, чтобы не обрабатывать все особые ситуации чисел с плавающей точкой, можно локализовать только интересующие типы, входящие в данную подгруппу.
Существуют два типа защищенных блоков, которые позволяют изменить распространение исключений. К ним относятся конструкции вида try…except…end и try…finally…end. Структурному блоку except…end передается управление только в случае появления исключения, когда требуется немедленно отреагировать на возникшую внештатную ситуацию:
Try
{ охраняемый блок операторов }
Except
{ Блок реакции с обработчиками особой ситуации }
end;
Внутри блока except создаются обработчики особых ситуаций для классов исключений. Обработчик имеет следующий формат:
on <класс особой ситуации> do
Begin
{ код обработки особой ситуации }
end;
Объект исключения содержит текстовое описание исключения в свойстве Message и адрес исключения, доступный по методу ExceptAddr.
Содержимое finally…end выполняется в любом случае для гарантированного освобождения выделенных ресурсов:
Try
{ охраняемый блок операторов }
Finally
{ Блок реакции с кодом завершения }
end;
Исключения реализуются через стек вызова (список вложенных подпрограмм), и имеют ассоциированную с ним область действия. Необработанные локально (в рамках процедуры-источника), исключения передается вверх по стеку вызова к следующему блоку, который сможет его обработать. Если исключение не обрабатывается пользователем, оно передается в глобальный обработчик исключений.
Поскольку исключение по возможности следует анализировать на максимально низком уровне, то оно в основном осуществляется в блоке try…except…end. Использовать эту конструкцию следует в случае, когда при возникновении исключения требуется выполнение неотложных действий.
Обработчики исключенийсхожи с виртуальными методами, т.к. их можно использовать для переопределения или дополнения обработки. Если требуется активизировать стандартную обработку исключения после выполнения обработке в блоке except, можно повторно сгенерировать данное исключение с помощью директивы Raise.
Общий синтаксис повторного возбуждения исключения таков:
Try
{ Охраняемые операторы }
Except
on ESomeException do
Begin
{ Локальная обработка особой ситуации }
raise; { повторное возбуждение исключения }
end;
end;
Схему структурированной обработки исключений можно представить в следующем виде:
Try
{ получение дескриптора запрашиваемого ресурса }
Try
{ выполнение потенциально опасных операций }
...
Finally
{ Блок реакции с кодом завершения; освобождение ресурса }
end;
{ Блок реакции с обработчиками особой ситуации }
Except
{ выделение требуемых классов исключений }
on < класс особой ситуации 1 > do
on < класс особой ситуации 2 > do
...
on < класс особой ситуации N > do
...
{ если требуется, повторное возбуждение исключительной ситуации }
raise;
end;
Дата добавления: 2021-12-14; просмотров: 309;