11
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();
    }
}

[编辑]为了消除混乱,是的,catch除了重新抛出异常之外,该块什么都不做。我想知道这是否会在调用块时导致某种不同的排序finally(假设抛出的异常被调用者捕获),但从我迄今为止从答案中推断出来的,它没有。

4

5 回答 5

7

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

于 2011-05-04T21:02:08.220 回答
5

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

于 2011-05-04T21:02:42.603 回答
3

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

于 2011-05-04T21:25:30.923 回答
2

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

于 2011-05-04T21:03:51.967 回答
1

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

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

于 2011-05-04T21:01:55.690 回答