3 Try Statement {Statement...} Except On {Name :} Exception type Do Statement {Else Statement} End;
Описание
Ключевое слово Try используется для отметки начала блока инструкций, которые перехватывают ошибки. Если происходит ошибка, программа не заканчивается. Вместо этого, управление передаётся или к Finally или Excep разделу.
Try используется следующими способами:
Версия 1:
В конструкции Try-Finally, инструкция Finally гарантированно выполнится, абсолютно независимо оттого, что произойдет в предложении Try. Однако, предложение Finally фактически не обрабатывает никаких исключений - программа закончится, если никаких пунктов Except не найдено (см. примечания ниже).
Try-Finally обычно используется подпрограммой для гарантированной очистки, например освобождения ресурсов.
Версия 2:
В этой версии, раздел Exept будет выполнен, только если предложение Try сгенерирует исключение. Это используется для принятия альтернативных действий, когда что-нибудь идет не так, как надо. Пункт except не может определить тип ошибки.
Версия 3:
Она подобно версии 2, но определяет различные действия для различных типов исключений, таких как EInOutError. Пункт Else может использоваться как ловушка всех неопределенных типов исключений. Общий тип исключений Exception может использоваться для захвата всех типов исключений.
По назначенному имени (Name) исключения, можно получить текст сообщения исключения (Name.Message) для его отображения или других использований.
Если исключение не обработано инструкциями On или Else (для 3 версии), то выполняется проверка, находимся ли мы во вложенном блоке Try. Если да, то обрабатывается пункт Except своего родительского Try.
Пункт Else не является, действительно необходимым, лучше использовать On E:Exception Do являющееся универсальной обработкой особых ситуаций, так как обеспечивает сообщение об ошибке (E.Message).
Важно: вы можете определить тип ошибки, которая произошла, при использовании универсальной обработки особых ситуаций - On E:Exception Do. E это указатель на объект исключения. E.ClassName дает тип исключения, такой как 'EDivByZero', как показано в последнем примере.
Следующий список исключений охватывает основные типы - всего имеется сотни классов исключения:
Exception Базовый класс EAbort Аварийное завершение работы без диалогового окна EAbstractError Абстрактная ошибка метода AssertionFailed Утверждают неудавшийся запрос EBitsError Булев массив ошибок ECommonCalendarError Календарная ошибка EDateTimeError Ошибка DateTime EMonthCalError Ошибка месяца EConversionError Вызывается Convert EConvertError Ошибка конвертирования объекта EDatabaseError Ошибка базы данных EExternal Ошибка аппаратных средств/Windows EAccessViolation Нарушение прав доступа EControlC Произошло аварийной завершение работы пользователем EExternalException Другая Внутренняя ошибка EIntError Целочисленная ошибка EDivByZero Деление на ноль EIntOverflow Переполнение целого числа ERangeError Вне диапазона значений EMathError Ошибка с плавающей запятой EInvalidArgument Плохое значение аргумента EInvalidOp Несоответствующая операция EOverflow Значение слишком большое EUnderflow Значение слишком маленькое EZeroDivide Деление на ноль EStackOverflow Серьёзная проблема Delphi EHeapException Проблемы динамической памяти EInvalidPointer Плохой указатель памяти EOutOfMemory Нет возможности распределить память EInOutError Ошибка ввода/вывода EInvalidCast Ошибка произведенная объектом EInvalidOperation Плохая операция компонента EMenuError Ошибка пункта меню EOSError Ошибка операционной системы EParserError Ошибка синтаксического анализа EPrinter Ошибка принтера EPropertyError Ошибка свойства класса EPropReadOnly Недопустимое обращение к свойству EPropWriteOnly Недопустимое обращение к свойству EThread Ошибка потока EVariantError Различная ошибка
Примечания
Иногда Вы хотите построить конструкцию подобно этому:
Try
...
Except
...
Finally
...
End;
где исключения заманены в ловушку и обработаны, но в любом случае, набор инструкций очистки будут выполнены. Это может быть достигнуто с помощью вложенных инструкций Try:
Try
Try
...
Except
...
End;
Finally
...
End;
Похожие команды
Except Начинает предложение заманивающее в ловушку ошибки Try инструкции
Finally Начинает безоговорочный раздел кода инструкции Try
On Определяет обработку особых ситуаций в предложении TryExcept
Пример кода : Версия 1: Деление на ноль с предложением finally
var
number, zero : Integer;
begin // Попытка деленя целого числа на нуль - чтобы поднять исключение
number := -1; Try
zero := 0;
number := 1 div zero;
ShowMessage('number / zero = '+IntToStr(number));
finally
if number = -1 then
begin
ShowMessage('Числу не было присвоено значение - использование значения по умолчанию');
number := 0;
end;
end;
end;
Числу не было присвоено значение - использование значения по умолчанию
Затем, программа заканчивается с сообщением об ошибке EDivByZero -, предложение finally не выловило ошибку.
Пример кода : Версия 2: Деление на ноль с простым блоком Except
var
number, zero : Integer;
begin // Попытка деленя целого числа на нуль - чтобы поднять исключение Try
zero := 0;
number := 1 div zero;
ShowMessage('number / zero = '+IntToStr(number));
except
ShowMessage('Неизвестная ошибка');
end;
end;
Неизвестная ошибка
Пример кода : Версия 3: Деление на ноль с предложением Except On
var
number, zero : Integer;
begin // Попытка деленя целого числа на нуль - чтобы поднять исключение Try
zero := 0;
number := 1 div zero;
ShowMessage('number / zero = '+IntToStr(number));
except
on E : Exception do
ShowMessage(E.ClassName+' поднята ошибка, с сообщением : '+E.Message);
end;
end;
EDivByZero поднята ошибка, с сообщением : Division by zero