
Выполнение завершающих действий
В некоторых ситуациях программисту не нужен собственный обработчик ошибок, но требуется, чтобы программа гарантированно выполнила определенные действия, связанные, например, с освобождением ресурсов. В такой ситуации удобнее использовать следующий блок:
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;