17.3 Операторы try...finally

Вверх  Предыдущий  Следующий

Оператор try..finally имеет следующий вид:


Оператор try...finally

1703


Если исключение не происходит внутри списка операторов, то программа работает, как будто ключевые слова try, finally и end отсутствуют, есть или нет exit: перед тем, как выйти, в любом случае, будет выполнено то, что находится в блоке, между ключевыми словами finally и end.

Если происходит исключение, программа немедленно передает управление из точки, где исключение произошло в ближайший блок (оператор) finally. (если нет обработчика исключения except)

Все операторы после ключевого слова finally, будет выполнены, а затем исключение будет автоматически передано на более высокий уровень. Любые операторы между местом, где возникло исключением и началом блока finally, пропускаются.

В качестве примера рассмотрим следущую процедуру:

Procedure Doit (Name : string);

Var F : Text;

begin

  Assign (F,Name);

  Rewrite (name);

  Try

    // ... Обработка файла ...

  Finally

    Close(F);

  end;

Если произойдёт исключение, то будет прервано нормальное выполнение процедуры и файл закрыт функцией Close. Если исключение не произошло, то будут выполнены все операции с файлом, после чего файл закрыт функцией Close.

Обратите внимание, что прежде, чем выйти по Exit, будет выполнен блок finally.

Дополнение предыдущего примера:

Procedure Doit (Name : string);

Var

  F : Text;

  B : Boolean;

begin

  B:=False;

  Assign (F,Name);

  Rewrite (name);

  Try

    // ... Обработка файла ...

    if B then exit; // Немедленно прекратить обработку

    // Дополнительная обработка файлов

  Finally

    Close(F);

  end;

Файл будет закрыт, даже если обработка завершается преждевременно с использованием функции Exit.