Конструкции Try..Finally и Try..Except в Delphi


Программы 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
A/B;
except
lbRes.Caption:=’Niht’;
// raise;
end;

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

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

Try
<операторы> Try
<операторы> Exceptionally
<операторы очистки> End; Except|Finally
<операторы очистки> End;

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


Комментарии запрещены.




Статистика