Структурированная обработка ошибок


В объектной модели языка Паскаль введено понятие исключений– ошибоквремени выполнения, которые могут возникать как при некорректных действиях пользователя, так и в случае неудачного выполнения различных действий (файловых операций, запроса ресурсов операционной системы и т.д.). Средства обработки исключений позволяют упростить задачу корректного выхода из подпрограмм, их вызвавших.

Базовым классом для всех исключений является 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;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.