【问题标题】:Control flow of the try...catch...finally control structuretry...catch...finally 控制结构的控制流程
【发布时间】:2011-03-11 18:04:19
【问题描述】:

我有一个 try...catch...finally 块,其 catch 重新抛出异常:

try
{
    startBombCountdownAndRunAsFastAsYouCan();
}
catch (BombExplodedOnYourFaceException ex)
{
    displayMessage("Hahaha! It blew up on your face!");
    throw ex;
}
finally
{
    cleanFloor();
}

displayMessage("Wow, you pulled it off!");

在这个例子中,无论是否抛出异常,我都需要执行cleanFloor()。那么问题来了:finally 子句是否总是被执行,而不管对应的catch 子句中是否重新抛出异常?

【问题讨论】:

  • 这是什么语言的?不同语言的行为之间可能存在细微差别。
  • 没有特别的语言。在我的实际程序中,我使用的是 C#。 (我讨厌它的每一分钟。)

标签: control-flow try-catch-finally


【解决方案1】:

是的,这就是 finally 概念创建的确切目的。

【讨论】:

    【解决方案2】:

    是的,finally 块总是会被执行。

    另外,作为旁注,如果您不打算使用显式捕获的异常,您应该只使用“catch { ... throw; }。

    供参考:

    http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx

    【讨论】:

      【解决方案3】:

      finally通常被执行,但不是总是

      考虑以下 Java 程序,其中未执行 finally 块:

      package test;
      public class TestFinally {
          public static void main(String[] args) {
              try {
                  throw new Exception ("throw!");
              }
              catch(Exception ex) {
                  System.out.println("catch!");
                  System.exit(0);
              }
              finally {
                  System.out.println("finally!");
              }       
          }
      }
      

      它输出:

      catch!
      

      finally catch 只有在控制权返回到catch 时才会执行,正如我们所见,这是永远无法保证的;判断你是否执行finally基本上就沦为Halting Problem了。

      实际上,finally通常会被执行。不是总是


      Peter Norvig 的 Java IAQ: Infrequently Answered Questions 对此有一些看法:

      问:finally 子句中的代码永远不会执行失败,对吧?

      嗯,几乎没有。但这里有一个例子,不管布尔选择的值如何,finally 代码都不会执行:

      try {
          if (choice) {
              while (true) ;
          } else {
              System.exit(1);
          }
      } finally {
          code.to.cleanup();
      }
      

      【讨论】:

      • 我在我的问题中假设控制流将退出try 部分try...catch...finally 构造。而且我还假设我的程序不会异常终止。
      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 2011-12-08
      • 2013-11-09
      • 2014-11-27
      • 2014-11-20
      相关资源
      最近更新 更多