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

Dan*_*ton 11 java exception-handling try-catch-finally control-flow

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } catch (Exception e) {
        throw e;
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

public Foo doDangerousStuff() throws Exception {
    try {
        dangerousMethod();
        return new Foo();
    } finally {
        mustBeCalledAfterDangerousMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

[编辑]为了清除混淆,是的,catch除了重新抛出异常之外,该块不执行任何操作.我想知道这是否会在finally调用块时引起某种不同的排序(假设调用者捕获了抛出的异常),但是从我从答案推断出来的情况来看,它并没有.

Mic*_*ker 7

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


Kal*_*Kal 5

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


Nat*_*yan 3

尽管两个源代码代表相同的执行顺序,但它们将产生不同的字节码。例如,第一个例程将有一个异常表,而第二个例程则不会。在没有检测的情况下,它们的字节码在执行期间将具有相同的效果。如果编译后对字节码进行检测,或者捕获的异常属于其类文件在执行期间不可用的类型,则这些方法的行为可能会有所不同