最终会阻塞执行吗?如果我通过出口;?
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
最终会阻塞执行吗?如果我通过出口;?
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
是的,finally
块总是执行,即使你在Exit
某个地方调用。如果他们不总是被处决,他们就不会值多少钱。
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 子句如何终止。
一个快速测试应用程序可以很快回答这个问题。
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.
为了完整起见 -如果执行 try..finally 块的进程或线程被 TerminateProcess/TerminateThread 终止, finally 块将不会执行。
例如,finally 块将不会在下面的代码中执行。
o := TObject.Create;
try
TerminateThread(GetCurrentThread, 0);
finally
o.Free;
end;