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

Begin

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

Finally

Try

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

On EIntError do

Except

Begin

ShowMessage('Ошибка # 22');

raise;

end;

end ;

После выдачи сообщения Ошибка # 22 исполнится стандартный обработчик ошибки EZeroDivide.

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

try

X := Y + Z;

raiseEIntOverflow.Create('Возможно переполнение');

end;

Если при сложении целых чисел, хранящихся в переменных Y и Z, возникнет ка­кая-то арифметическая ошибка (базовый класс EIntError), то в обработчике этой ошибки будет сгенерирована другая исключительная ситуация EIntOverflow, а обра­ботка ошибки EIntError завершится.

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

try

операторы finally

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

end;

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

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

varDynArr: array ofinteger;

SetLength(DynArr,100000) ;

DynArr := nil

end;

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

on E: EIntError do Р;

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

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

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

on E: EIntError do

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

raise;

end;

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

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

on E: EIntError do

ShowException(E);

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

procedureTMyForm.FormActivate(Sender: TObject);