我在对一些看起来像这样的代码进行故障排除时遇到了非常痛苦的故障排除经验:

try {
   doSomeStuff()
   doMore()
} finally {
   doSomeOtherStuff()
}

这个问题很难解决,因为 doSomeStuff() 抛出了一个异常,这反过来又导致 doSomeOtherStuff() 也抛出了一个异常。第二个异常(由 finally 块抛出)被抛出到我的代码中,但它没有处理第一个异常(从 doSomeStuff() 抛出),这是问题的真正根本原因。

如果代码改为这样,问题就很明显了:
try {
    doSomeStuff()
    doMore()
} catch (Exception e) {
    log.error(e);
} finally {
   doSomeOtherStuff()
}

所以,我的问题是:

在没有任何 catch 块的情况下使用 finally 块是众所周知的 Java 反模式吗? (它当然似乎是明显众所周知的反模式“不要吞噬异常!”的一个不太明显的子类)

最佳答案

一般来说,不,这不是反模式。 finally 块的重点是确保无论是否抛出异常,都可以清除内容。异常处理的全部意义在于,如果你不能处理它,你就让它冒泡给可以通过相对干净的带外信号异常处理提供的人。如果您需要确保在抛出异常时清理内容,但无法在当前范围内正确处理异常,那么这正是正确的做法。您可能只想更加小心地确保您的 finally 块不会抛出。

关于c# - 没有 catch 块的 finally 块是 Java 反模式吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/601152/

10-17 01:57