Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции СД.doc
Скачиваний:
212
Добавлен:
19.03.2015
Размер:
1.81 Mб
Скачать
    1. 3.4. Структурированная обработка ошибок

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

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