25

最终会阻塞执行吗?如果我通过出口;?

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

4 回答 4

35

是的,finally块总是执行,即使你在Exit某个地方调用。如果他们不总是被处决,他们就不会值多少钱。

于 2011-12-23T01:54:54.597 回答
28

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

相关文件指出(强调我的):

try...finally 语句的语法是

try 
  statementList1
finally
  statementList2 
end 

其中每个 statementList 是由分号分隔的语句序列。

try...finally 语句执行 statementList1 中的语句(try 子句)。如果 statementList1 在没有引发异常的情况下完成,则执行 statementList2(finally 子句)。如果在 statementList1 执行期间引发异常,则将控制权转移到 statementList2;一旦 statementList2 完成执行,就会重新引发异常。如果对 Exit、Break 或 Continue 过程的调用导致控制离开 statementList1,则 statementList2 将自动执行。 因此 finally 子句总是被执行,不管 try 子句如何终止。

于 2011-12-23T06:11:28.000 回答
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.
于 2011-12-23T04:23:25.247 回答
10

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

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

o := TObject.Create;
try
  TerminateThread(GetCurrentThread, 0);
finally
  o.Free;
end;
于 2011-12-23T08:37:34.510 回答