在对一些看起来像这样的代码进行故障排除时,我遇到了非常痛苦的故障排除经验:
try {
doSomeStuff()
doMore()
} finally {
doSomeOtherStuff()
}
问题很难解决,因为 doSomeStuff() 引发了异常,这反过来又导致 doSomeOtherStuff() 也引发了异常。第二个异常(由 finally block 抛出)被抛出到我的代码中,但它没有处理第一个异常(从 doSomeStuff() 抛出),这是问题的真正根本原因。
如果代码是这样说的,问题就会很明显:
try {
doSomeStuff()
doMore()
} catch (Exception e) {
log.error(e);
} finally {
doSomeOtherStuff()
}
所以,我的问题是:
在没有任何 catch block 的情况下使用 finally block 是众所周知的 java 反模式吗? (它当然似乎是众所周知的反模式“不要吞噬异常!”的一个不太明显的子类)
最佳答案
一般来说,不,这不是反模式。 finally block 的目的是确保无论是否引发异常,都可以清理内容。异常处理的全部意义在于,如果您无法处理它,您可以通过提供的相对干净的带外信号异常处理提供的方法,让它冒泡给可以处理的人。如果您需要确保在引发异常时清理内容,但无法正确处理当前范围内的异常,那么这正是正确的做法。您可能需要更加小心,以确保您的 finally block 不会抛出。
关于c# - 没有catch block 的finally block 是java反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601152/