17.3 Операторы try...finally |
Вверх Предыдущий Следующий |
Оператор try..finally имеет следующий вид: Оператор try...finally Если исключение не происходит внутри списка операторов, то программа работает, как будто ключевые слова 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. |