在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();
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句