在 Java 7 中,该功能被添加到(通过getSuppressed()
) 获取从 try-with-resources 语句的隐式 finally 块抛出的异常。
似乎仍然没有一种方法(据我所知)可以做相反的事情 - 当有一个显式的finally块并且抛出异常时,掩盖从try/catch抛出和挂起的异常。
为什么 Java 不提供通过类似于以下机制来获取这些隐藏/丢失的异常的功能getSuppressed()
?
该功能的实现似乎与中使用的类似getSuppressed()
或链式异常,所提供的好处将非常有用,但它仍然被排除在每个版本之外。
通过类似于以下的方法调用向程序员提供这些被屏蔽的异常会有什么危险getSuppressed()
?
(如果这个功能已经存在并且我只是一无所知,请提前道歉。)
镇压的事isn't仅限于尝试资源,并且您can自己将其用于类似的情况。例如,它is为其他情况提供。
try-with-resources 将关闭资源的逻辑放在后台,因此您无法直接访问自己的代码来处理过程中发生的任何异常。所以他们添加了“抑制”的东西,这样他们就可以在幕后代码中使用它。
但聪明的是,他们没有only让它成为可以在那里使用的东西。您可以自己使用它,通过Throwable#addSuppressed http://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html#addSuppressed-java.lang.Throwable-.
您可以在给出的伪代码示例中看到这一点JLS §14.20.3.1 http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#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();
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)