Описание |
Ключевое слово 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 Определяет обработку особых ситуаций в предложении Try Except
Raise Поднимает исключение
| |
|
Пример кода : Версия 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
|
|