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>
答案 0 :(得分:7)
他们是一样的。我会使用第二个版本。
答案 1 :(得分:5)
是。由于你的方法已经抛出“Exception”,你不需要捕获它并重新抛出它。除非你想做@Dave提到的事情。
答案 2 :(得分:3)
虽然两个源代码表示相同的执行序列,但它们将导致不同的字节码。例如,第一个例程将具有异常表,而第二个例程则不会。在没有检测的情况下,它们的字节码在执行期间将具有相同的效果。 可能如果在编译后检测字节码,或者如果捕获的异常是在执行期间类文件不可用的类型,则这些方法的行为会有所不同。
答案 3 :(得分:2)
当你抛出异常时,你已经捕获了catch子句,除了再次抛出它之外什么都不做,是的,两个代码都会做同样的事情。
答案 4 :(得分:1)
你是对的,它是一样的。甚至堆栈跟踪都会在那里:)
但是如果将异常包装到更高级别的代码中,则可能会使用类似的代码。如果代码看起来与陈述完全一样,那就毫无意义了。