代码之家  ›  专栏  ›  技术社区  ›  MedAl

不使用try/catch处理异常

  •  0
  • MedAl  · 技术社区  · 7 年前

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

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

    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();
    
    }
    

    有办法处理这个案子吗?或者应该重构该方法以自行处理异常?

    编辑

    评论中提供了一些很好的提示。考虑到这一点,我最终选择的解决方案是提取触发警告的代码,并使用资源进行尝试。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Stephen C    7 年前

    你就是这样做的。使用try with资源。

    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块中抛出的异常,并关闭读卡器堆栈。如果(假设)隐含 close() try with资源执行的是引发异常:

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

    注意,我已经重写了`

        new InputStreamReader(is, Charset.defaultCharset())
    

        new InputStreamReader(is)
    

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