最后会阻止执行吗?如果我通过退出; ?
procedure someProc;
begin
Try
Exit;
finally
do_something;
end;
end;
答案 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;