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

waz*_*123 22 delphi try-finally

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

procedure someProc;
begin
    Try
      Exit;
    finally
     do_something;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

Set*_*gie 29

是的,finally即使你在Exit某个地方打电话,积木总是会执行.如果它们不总是被执行,它们就不值得.


Dav*_*nan 26

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

相关文件陈述(强调我的):

try ... finally语句的语法是

try 
  statementList1
finally
  statementList2 
end 
Run Code Online (Sandbox Code Playgroud)

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

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

  • @TLama 我没有。它们被捕获所有“异常终止”所覆盖!;-) (2认同)

Ken*_*ite 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.
Run Code Online (Sandbox Code Playgroud)


gab*_*abr 9

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

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

o := TObject.Create;
try
  TerminateThread(GetCurrentThread, 0);
finally
  o.Free;
end;
Run Code Online (Sandbox Code Playgroud)

  • 我编辑了我的文字,使其更加完整.您的答案涵盖了这一特定方面的深度,我认为将您的示例合并到我的答案中将会减损文档引用的主要观点.谢谢,+ 1. (2认同)