Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Исключительные ситуации.doc
Скачиваний:
7
Добавлен:
09.11.2019
Размер:
113.66 Кб
Скачать

Выполнение завершающих действий

В некоторых ситуациях программисту не нужен собственный обработчик ошибок, но требуется, чтобы программа гарантированно выполнила определенные действия, связанные, например, с освобождением ресурсов. В такой ситуации удобнее исполь­зовать следующий блок:

try

операторы finally

заключительные действия

end;

Заключительные действия будут выполнены в любом случае, независимо от того, возникнет ли исключительная ситуация в операторах части try или, например, выполнится попытка выхода из подпрограммы с помощью процедуры Exit.

В следующем тексте освобождение памяти, выделенной для динамического массива DynArr (финальный оператор присваивания значения nil), произойдет независимо от того, успешно ли создан и обработан массив DynArr или памяти для него нехватило:

var DynArr: array of integer;

try

SetLength(DynArr,100000) ;

finally

DynArr := nil

end ;

Передача объектов, связанных с исключительными ситуациями

Когда в программе возникает исключительная ситуация, специальный обработ­чик создает соответствующий ей объект. Чтобы получить доступ к этому объекту, в описании класса в части except надо предварительно указать произвольный идентификатор:

on E: EIntError do Р;

В случае возникновения ошибки EIntError объект соответствующего класса будет

сохранен в переменной Е (описывать ее не надо), к которой можно обращаться, например, для занесения новых значений в ее свойства.

У любого класса исключительной ситуации есть два свойства: Message, в котором хранится строка, выводимая в окне сообщения, и HelpContext, число-идентификатор раздела справочной системы для вывода более подробной информации об ошибке.

on E: EIntError do

begin

Е.Message := 'Ошибка вычислений';

raise;

end;

Если доступ к объекту, описывающему ошибку, надо получить в части else блока except, где никакие классы явно не упоминаются, можно использовать функцию ExceptObject, которая возвращает такой объект.

Программный обработчик ошибок

По умолчанию при возникновении исключительной ситуации для ее обработки вызывается процедура HandleException. Она проверяет, обрабатывает ли приложение событие On Exception. Если обработка отсутствует, выводится диалоговое окно, с кратким сообщением об ошибке. Такое окно можно вызывать с помощью стандартной процедуры ShowException, которая получает в качестве параметра объект, имеющий тип исключительной ситуации:

on E: EIntError do

ShowException(E);

Обработчик события On Exception задается явно, с помощью оператора присваивания, например в методе создания или активации формы:

procedure TMyForm.FormActivate(Sender: TObject);

begin

Application.OnException := AppException;

end;

Процедуру AppException надо определить в классе TmyForm:

procedure AppException(Sender: TObject; E: Exception);

Затем ее надо описать в части реализации. В следующем примере при обнаруже­нии исключительной ситуации отображается стандартное информационное окно, после чего работа приложения завершается:

procedure TMyForm.AppException (Sender: TObject; E: Exception);

begin

Application.ShowException(E);

Application.Terminate;

end;