如何在try-with-resource语句中捕获close方法引发的异常

Posted

技术标签:

【中文标题】如何在try-with-resource语句中捕获close方法引发的异常【英文标题】:How to catch exception thrown by close method in try-with-resource statement 【发布时间】:2015-09-24 03:58:36 【问题描述】:

我正在阅读 Java 中的 try-with-resource 语句,该语句可用于指定任意数量的资源。

try (Resource1 res1 = initialize_code; Resource1 res2 = initialize_code; ...) 

    statement;

现在,当 try 块退出(正常或异常抛出异常)时,将调用所有资源对象的 close 方法。但是一些close 方法可以抛出异常。如果close 本身抛出异常,这种情况会发生什么?

【问题讨论】:

【参考方案1】:

但是一些close方法会抛出异常。

是的,他们可以,你是对的。此外,资源的关闭顺序与其初始化的相反。

如果close方法本身抛出异常会怎样?

正如你提到的,一些close 方法也可以抛出异常。如果在正常执行 try 块时发生这种情况,则将异常抛出给调用者。

但是当另一个异常被抛出,导致close 要调用的资源的方法,close 方法之一抛出异常(实际上是重要性较低的异常)?

在这种情况下,原始异常被重新抛出,由close方法引起的异常 也被捕获并附加为supressed exception。这实际上是使用 try-with-resource 的优势之一,因为手动实现这种机制会很乏味。

try 
 ///statements.
 catch (IOException e)  
   Throwable[] supressedExceptions = ex.getSupressed();

【讨论】:

以上是关于如何在try-with-resource语句中捕获close方法引发的异常的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中对接口对象使用 try-with-resources 语句

在 try-with-resources 中声明的变量的注释?

谁在 close 方法中捕获异常?(try-with-resources)

如何从 try-with-resource 语句中关闭资源

Java 处理异常 9 个最佳实践

我应该在 try-with-resources 语句中声明每个资源吗?