【问题标题】:Does the statements in the Finally block still execute in this piece of code ?finally 块中的语句是否仍然在这段代码中执行?
【发布时间】:2012-01-26 13:03:01
【问题描述】:

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

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

【问题讨论】:

标签: delphi try-finally


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    相关的documentation 状态(强调我的):

    try...finally 语句的语法是

    try 
      statementList1
    finally
      statementList2 
    end 
    

    其中每个 statementList 是一个语句序列 用分号分隔。

    try...finally 语句执行 statementList1 中的语句(try 子句)。如果 statementList1 在没有引发异常的情况下完成, statementList2(finally 子句)被执行。如果在 statementList1 执行期间引发异常, 控制转移到 statementList2;一次语句List2 完成执行,异常被重新引发。 如果调用 退出、中断或继续过程导致控制离开 statementList1, statementList2 自动执行。 因此,无论 try 子句如何终止,都会始终执行 finally 子句。

    【讨论】:

    • +1 用于在 finally 子句未执行时列出这些条件。
    • @MrLister 不,我没有。再读一遍第一段。
    • 不要忘记停电、自然灾害和可能的外星人袭击 :-)
    • @TLama 我没有。它们被全部“异常终止”捕获! ;-)
    • 啊,对不起。我错过了。嗯,这也应该包括坠落的钢琴事故。
    【解决方案3】:

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

    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.
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我在回答中错过了吗?也许我应该说异常终止线程而不是程序。
      • 你是对的,你这么说。随意将我的示例合并到您的答案中,然后我将删除我的示例。
      • 我编辑了我的文本以使其更加完整。您的回答深入涵盖了该特定方面,我认为将您的示例合并到我的回答中会减损文档引用的要点。谢谢和 +1。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2011-02-18
      相关资源
      最近更新 更多