为什么Java不支持从最终抛出异常时从try / catch中检索异常?

Java 7中,该功能被添加到(通过getSuppressed())获取从try-with-resources语句的隐式finally块中抛出的异常.

似乎还没有一种方法(我知道)做相反的事情 – 当有一个显式的finally块并抛出异常时,屏蔽抛出的异常和try / catch中的异常.

为什么Java不提供通过类似于getSuppressed()的机制来获取这些隐藏/丢失异常的功能?

看起来这个功能的实现与getSuppressed()或链式异常中使用的类似,并且提供的好处将非常有用,但它仍然被排除在每个版本之外.

通过类似于getSuppressed()的方法调用,程序员可以使用这些屏蔽异常的危险是什么?

(如果这个功能已经存在,请提前道歉,我只是无能为力.)

最佳答案
抑制事物不仅限于尝试资源,您可以自己将它用于类似的情况.例如,它是为其他情况提供的.

try-with-resources提供了在幕后关闭资源的逻辑,因此您无法在自己的代码中直接访问以处理在此过程中发生的任何异常.所以他们添加了“抑制”的东西,以便他们可以在幕后代码中使用它.

但巧妙的是,他们不仅使它成为可以在那里使用的东西.您可以通过Throwable#addSuppressed自己使用它.

您可以在JLS §14.20.3.1中给出的伪代码示例中看到这一点;这是它的真实代码版本:

{
    SomeResource someResource = null;
    Throwable primaryException = null;

    try {
        someResource = /*...get the resource...*/;
        /*...do something...*/
    }
    catch (Throwable t) {
        primaryException = t;
        throw t;
    }
    finally {
        if (someResource != null) {
            if (primaryException != null) {
                // Dealing with a primary exception, close the resource
                // and suppress any exception resulting
                try {
                    someResource.close();
                }
                catch (Throwable suppressed) {
                    primaryException.addSuppressed(suppressed);
                }
            }
            else {
                // Not dealing with a primary exception, close the
                // resource without suppressing any resulting exception
                someResource.close();
            }
        }
    }
}

转载注明原文:为什么Java不支持从最终抛出异常时从try / catch中检索异常? - 代码日志