控制流程的try ... catch ...最终控制结构

时间:2011-03-11 18:04:20

标签: control-flow try-catch-finally

我有一个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子句中重新抛出?

3 个答案:

答案 0 :(得分:5)

是的,这是最终概念创建的确切目的。

答案 1 :(得分:2)

是的,将始终执行finally块。

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

供参考:

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

答案 2 :(得分:2)

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!

如果控件永远返回到catch,则只会执行finally catch,因为我们看不到它;确定您是否执行finally基本上缩减为Halting Problem

实际上,finally块将通常执行。不总是


Peter Norvig的Java IAQ: Infrequently Answered Questions对此有所了解:

  

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

     

嗯,几乎没有。但是这里是一个最终代码不会执行的例子,无论布尔选择的值是什么:

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