首先,很抱歉问了一个关于什么是老生常谈的话题的问题。我遇到了很多问题,答案建议从关闭 finally 块中的资源的方法中吞下(捕获和忽略/记录)潜在异常。这似乎是一种普遍接受的模式。但是我还没有看到有人解释原因。这里只是一个例子:Try-catch-finally 和 try catch。
我知道从 finally 块抛出的任何异常都会“掩盖”在相应的 try 块中抛出的任何异常,但我不明白为什么这是一件坏事。例如:
Resource r = new Resource();
try {
r.use();
other();
} finally {
r.close();
}
我目前的理解是:
- 如果只是
close
抛出一个异常,我们绝对不想吞下它。 - 如果两者都
use
抛出close
异常,则可能是出于相同的根本原因,并且传播哪个异常并不重要(它们都将包含同样有用的信息?)。 - 如果两者都
other
抛出close
异常,则有两个不相关的问题。可以说,首先发生的那个应该传播,但是没有任何理由表明第一个异常导致了第二个异常(存在吗?),所以两者都可以。
我错了什么?