delphi try except finally

Try используется следующими способами:

В конструкции Try-Finally, инструкция Finally гарантированно выполнится, абсолютно независимо оттого, что произойдет в предложении Try. Однако, предложение Finally фактически не обрабатывает никаких исключений — программа закончится, если никаких пунктов Except не найдено (см. примечания ниже).

Try-Finally обычно используется подпрограммой для гарантированной очистки, например освобождения ресурсов.

В этой версии, раздел Exept будет выполнен, только если предложение Try сгенерирует исключение. Это используется для принятия альтернативных действий, когда что-нибудь идет не так, как надо. Пункт except не может определить тип ошибки.

Она подобно версии 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:

Try
Try
.
Except
.
End;
Finally
.
End; Похожие команды

Except Начинает предложение заманивающее в ловушку ошибки Try инструкции

Finally Начинает безоговорочный раздел кода инструкции Try

On Определяет обработку особых ситуаций в предложении Try Except

Программы Delphi имеют встроенную обработку исключений по умолчанию, которая в некоторых случая может оказаться достаточной. встроенная обработка исключений преследует, во-первых, получение более подробной информации об ошибке и/или месте ее возникновения и, во-вторых, включение собственного кода по ее обработке, если стандартная обработка не устраивает.

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

Конструкция Try .. Finally .. End

Конструкция Try..Finally гарантирует, что программа выполнит операторы, освобождающие ресурсы, независимо от того, было или нет возбуждено исключение. Таким образом, эта конструкция используется тогда, когда вполне достаточным является просто безопасно завершить программу после возникновения исключения. Исключения в таких конструкциях не обрабатываются, их обработка будет передана далее. Если другой обработки не предусмотрено, то управление будет передано обработчику по умолчанию.

Синтаксис конструкции следующий:

Try
Finally
End;

Следует отметить, что, если исключение не будет возбуждено, то операторы из раздела Finally также будут освобождать ресурсы. Отличие заключается в том, что:
• во-первых, при возникновении исключения часть операторов из раздела Try не выполняется, а при нормальной работе — выполняются все;
• во-вторых, после освобождения ресурсов вследствие возбуждения исключения поиск обработчика исключения продолжится, поскольку исключения этой конструкцией не обрабатываются, а при нормальной работе будет выполняться оператор, следующий за конструкцией Try..Finally.
Следует по возможности получать различные ресурсы перед конструкцией Try. Это гарантирует, что раздел Finally сможет должным образом освободить ресурсы.

C:=Cursor;
Cursor := crHourGlass;
edDivr.Visible:=false;
try
A/B
finally
Cursor:=C;
edDivr.Visible:=true;
end;

Конструкция Try .. Except.. End

Операторы в разделе Except выполняются только при возбуждении исключений, но никогда при нормальной работе программы. Более того, в разделе Except может быть несколько обработчиков исключений, каждый из которых ориентирован на определенный тип исключения. После выполнения операторов из раздела Except исключения уничтожаются, а выполнение программы продолжается с оператора, следующего за конструкцией Try..Except.

Синтаксис конструкции следующий:

Try
Except
End;

Как и ранее, операторы раздела Try могут возбуждать исключения. Раздел Except содержит операторы, которые выполняют действия по очистке (cleanup code, termination code). Однако если ошибка не возникает, то операторы из раздела Except пропускаются.

Операторы раздела Try в обеих конструкциях называются защищенным кодом.

Вложенные конструкции Try

Delphi позволяет использовать вложенные конструкции обработчиков исключений. Глубина вложения и последовательность следования конструкций не ограничена. Общий синтаксис вложенных конструкций Try:

Try
Try
Exceptionally
End; Except|Finally
End;

Так, поскольку конструкция Try..Finally в действительности не обрабатывает исключения, то, заключив ее внутрь конструкции Try..Except, мы с помощью конструкции Try..Finally можем возвратить ресурсы системе, а уже затем с помощью конструкции Try..Except обработать исключение.

Как вообще работает этот блок? Нашел простой код его применения, привязал к кнопке, но он мне выдает ошибку, что-то там by zero (я так понял типа на ноль нельзя делить) и приходиться сбрасывать работу программы.

1 ответ 1

Это очень полезный инструмент ,и, кроме того, очень распространенный. Не знаю, как вы искали в гугле, если ничего не нашли на эту тему.

управляет поведением возможной исключительной ситуацией, которая может возникнуть в секции «TRY». Если такая возникает, то выполнение кода в секции «TRY» прекращается и моментально перепрыгивает в начало секции «EXCEPT» и код, находящийся там, выполняется до конца, т.е до «END». Рассмотрим пример обработки исключительной ситуацией «EZeroDevide»(деление на ноль) :

Также существует еще одна конструкция обработки исключительных ситуаций:

Данный блок функционирует немного иначе: если в секции «TRY» возникнет исключительная ситуация, то выполнение кода оставновится в этой секции и перепрыгнет в секцию «FINALLY». Но даже если никакой исключительной ситуации не возникнет, то в конце выполнения кода в «TRY», секция «FINALLY» все равно будет выполнена. Эту конструкцию уместно применять, если в конце работы надо произвести операции по, например, освобождению памяти. Пример:

Оцените статью