这是`try..catch..finally`多余的?

时间:2011-05-04 20:57:35

标签: java exception-handling control-flow try-catch-finally

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

这与我们省略catch子句的行为有什么不同吗?

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}

[edit]为了清除混淆,是的,catch块除了重新抛出异常外什么都不做。我想知道这是否会在调用finally块时引起某种不同的排序(假设调用者捕获了抛出的异常),但是从我从答案推断出来的情况来看,它不会。 / p>

5 个答案:

答案 0 :(得分:7)

他们是一样的。我会使用第二个版本。

答案 1 :(得分:5)

是。由于你的方法已经抛出“Exception”,你不需要捕获它并重新抛出它。除非你想做@Dave提到的事情。

答案 2 :(得分:3)

虽然两个源代码表示相同的执行序列,但它们将导致不同的字节码。例如,第一个例程将具有异常表,而第二个例程则不会。在没有检测的情况下,它们的字节码在执行期间将具有相同的效果。 可能如果在编译后检测字节码,或者如果捕获的异常是在执行期间类文件不可用的类型,则这些方法的行为会有所不同。

答案 3 :(得分:2)

当你抛出异常时,你已经捕获了catch子句,除了再次抛出它之外什么都不做,是的,两个代码都会做同样的事情。

答案 4 :(得分:1)

你是对的,它是一样的。甚至堆栈跟踪都会在那里:)

但是如果将异常包装到更高级别的代码中,则可能会使用类似的代码。如果代码看起来与陈述完全一样,那就毫无意义了。