Finally块中的语句是否仍然在这段代码中执行?

时间:2011-12-23 01:51:19

标签: delphi try-finally

最后会阻止执行吗?如果我通过退出; ?

procedure someProc;
begin
    Try
      Exit;
    finally
     do_something;
    end;
end;

4 个答案:

答案 0 :(得分:27)

是的,finally阻止总是执行,即使你在某处调用Exit。如果他们总是执行,他们就不值得。

答案 1 :(得分:25)

finally子句将始终执行,除非执行线程进入非终止循环,无限期阻塞或异常终止,同时执行try子句。

相关的documentation州(强调我的):

  

try ... finally语句的语法是

try 
  statementList1
finally
  statementList2 
end 
     

其中每个statementList是一系列语句   以分号分隔。

     

try ... finally语句执行   statementList1中的语句(try子句)。如果statementList1完成而没有引发异常,   statementList2(finally子句)被执行。如果在执行statementList1期间引发异常,   控制转移到statementList2;一旦statementList2   完成执行后,重新引发异常。 如果打电话给   退出,中断或继续过程导致控制离开   statementList1,statementList2自动执行。   因此,无论try子句如何终止,都始终执行finally子句。

答案 2 :(得分:12)

快速测试应用可以很快回答这个问题。

program TestFinally;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  try
    WriteLn('Before exiting');
    Exit;
  finally
    WriteLine('In finally. If you see this, it was written after "Exit" was called');
    ReadLn;
  end;
end.

答案 3 :(得分:8)

为了完整起见 - 如果使用TerminateProcess / TerminateThread终止执行try..finally块的进程或线程,则finally块将执行。

例如,finally块将不会在下面的代码中执行。

o := TObject.Create;
try
  TerminateThread(GetCurrentThread, 0);
finally
  o.Free;
end;