在对一些看起来像这样的代码进行故障排除时,我遇到了非常痛苦的故障排除经验:
try {
doSomeStuff()
doMore()
} finally {
doSomeOtherStuff()
}
这个问题很难解决,因为 doSomeStuff() 引发了异常,这反过来又导致 doSomeOtherStuff() 也引发了异常。第二个异常(由 finally 块抛出)被抛出到我的代码中,但它没有处理第一个异常(从 doSomeStuff() 抛出),这是问题的真正根本原因。
如果代码是这样说的,问题就会很明显:
try {
doSomeStuff()
doMore()
} catch (Exception e) {
log.error(e);
} finally {
doSomeOtherStuff()
}
所以,我的问题是:
在没有任何 catch 块的情况下使用 finally 块是众所周知的 java 反模式吗?(它当然似乎是众所周知的反模式“不要吞噬异常!”的一个不太明显的子类)