Begin
Передача объектов, связанных с исключительными ситуациями
Finally
Try
Выполнение завершающих действий
On EIntError do
Except
Begin
ShowMessage('Ошибка # 22');
raise;
end;
end;
После выдачи сообщения Ошибка # 22 исполнится стандартный обработчик ошибки EZeroDivide.
Из текста обработчика ошибки можно генерировать другие исключительные ситуации, например:
try
X:= Y + Z;
raise EIntOverflow.Create('Возможно переполнение');
end;
Если при сложении целых чисел, хранящихся в переменных Y и Z, возникнет какая-то арифметическая ошибка (базовый класс EIntError), то в обработчике этой ошибки будет сгенерирована другая исключительная ситуация EIntOverflow, а обработка ошибки EIntError завершится.
В некоторых ситуациях программисту не нужен собственный обработчик ошибок, но требуется, чтобы программа гарантированно выполнила определенные действия, связанные, например, с освобождением ресурсов. В такой ситуации удобнее использовать следующий блок:
try
операторы finally
|
|
заключительные действия
end;
Заключительные действия будут выполнены в любом случае, независимо от того, возникнет ли исключительная ситуация в операторах части try или, например, выполнится попытка выхода из подпрограммы с помощью процедуры Exit.
В следующем тексте освобождение памяти, выделенной для динамического массива DynArr (финальный оператор присваивания значения nil), произойдет независимо от того, успешно ли создан и обработан массив DynArr или памяти для него нехватило:
var DynArr: array of integer;
…
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 задается явно, с помощью оператора присваивания, например в методе создания или активации формы:
procedure TMyForm.FormActivate(Sender: TObject);