gpt4 book ai didi

java - 为什么Java不支持在finally抛出异常时从try/catch lost中检索异常?

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:40 25 4
gpt4 key购买 nike

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

似乎仍然没有办法(据我所知)做相反的事情 - 当有一个显式的 finally block 并抛出异常时,屏蔽从 try/catch 抛出和挂起的异常。

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

这个功能的实现似乎与 getSuppressed() 或链式异常中使用的类似,所提供的好处将非常有用,但它仍然被排除在外每次发布。

通过类似于 getSuppressed() 的方法调用向程序员提供这些屏蔽异常会有什么危险?

(如果此功能已经存在并且我只是一无所知,请提前致歉。)

最佳答案

抑制并不仅限于 try-with-resources,您可以自己将其用于类似情况。例如,它为其他情况提供的。

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 - 为什么Java不支持在finally抛出异常时从try/catch lost中检索异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24181489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com