在没有 try/catch 的情况下处理异常

Handle exception without try/catch

我有一个方法,抛出的异常必须由调用者处理,而不是由方法本身处理(异常在签名中指定,而不是在正文中指定)。 但是,如果发生不好的事情,我想在调用者必须处理问题之前使用类似于 finally 语句的东西来关闭我的 reader。

在当前配置中,如果触发异常,reader保持打开状态。

private static void executeFile(Connection c, String fileName) throws SQLException, IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), Charset.defaultCharset())); // $JL-I18N$

    /*
        Lot of stuff happen here, and might trigger exceptions
    */

    reader.close();

}

有办法处理这种情况吗?还是应该重构该方法以自行处理异常?

编辑

评论中提供了一些很好的提示。考虑到这一点,我最终选择的解决方案是提取触发警告的代码并使用 try-with-resources。

你就是这样做的。使用 try-with-resources.

private static void executeFile(Connection c, String fileName)
       throws SQLException, IOException {
    try (InputStream is = new FileInputStream(fileName);
         InputStreamReader isr = new InputStreamReader(is);
         BufferedReader reader = new BufferedReader(isr)) {
        /* Lots of stuff */
    }
}

try 块中抛出的异常将被传播,reader 堆栈将被关闭。如果(假设地)try-with-resource 执行的隐式 close() 是抛出异常:

  • 如果另一个异常已经在传播,它将被抑制,
  • 否则会被传播。

注意我重写了`

    new InputStreamReader(is, Charset.defaultCharset())

作为

    new InputStreamReader(is)

因为它们是等效的:检查 javadoc。另一个重写只是为了可读性,尽管它确实说明 try-with-resources 可以管理多个资源。