我刚刚经历了一个非常痛苦的故障排除过程,排查的代码看起来像这样:
try {
doSomeStuff()
doMore()
} finally {
doSomeOtherStuff()
}
因为doSomeStuff()引发了异常,而这又导致doSomeOtherStuff()也抛出了异常,所以这个问题很难进行故障排除。try语句块中的第二个异常被传递到了我的代码中,但它没有处理来自doSomeStuff()的第一个异常,而那才是问题的真正根源。如果代码改成了下面这样,问题就会容易得多:
try {
doSomeStuff()
doMore()
} catch (Exception e) {
log.error(e);
} finally {
doSomeOtherStuff()
}
所以,我的问题是:
在没有任何catch块的情况下使用finally块是否是一个众所周知的Java反模式?(它显然似乎是一个不易察觉的子类,属于明显众所周知的反模式“不要吞噬异常!”)