Java try-with-resource - 关闭资源时记录错误

标签 java try-catch

我有以下内容:-

private static String loadString(File f) {
    StringBuffer results = new StringBuffer();
    Reader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(...));
        ...
        while (reader.read(data) >= 0) {
            ... 
       }
    } catch (IOException e) {
        logger.warn(....);
    } finally {
        try {
            reader.close();
        } catch (IOException e) {
            logger.warn(....);
        }
    }
    return results.toString();
}

我想使用 Java 7 try-with-resources 自动关闭资源,但也想在关闭流时出现错误时保留记录的警告,并且此日志消息将与此不同当从 try 主体抛出异常后捕获异常时,会在上面记录。
执行此操作的最优雅的方法是什么,因为我认为 try 子句和资源的关闭都抛出相同的异常,这可能会使维护这两个单独的记录器警告变得棘手?
提前致谢

最佳答案

如果关闭资源时抛出异常,则在处理从 try block 内部抛出的另一个异常时,该异常将被抑制并添加到初始异常中。

如果日志框架支持抑制异常,并且您将异常提供给日志框架,那么您不需要执行任何操作。

否则,您需要自己记录被抑制的异常,如下所示:

private static String loadString(File f) {
    StringBuffer results = new StringBuffer();
    try (Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(f)))) {
        ...
        while (reader.read(data) >= 0) {
            ... 
        }
    } catch (IOException e) {
        logger.warn(....);
        for (Throwable ex : e.getSuppressed())
            logger.warn(....);
    }
    return results.toString();
}

关于Java try-with-resource - 关闭资源时记录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44659032/

相关文章:

java - StaX 解析 : Transformer. 变换方法自动移动光标,并不总是很好

java - 如何在 web.xml 之外动态配置 WebLogicCluster 属性

javascript - 我可以将 JavascriptExecutor 与 Appium 一起使用吗?

Java构造函数安全

c++ - 我可以制作一个#define 并一次性使用它吗?

java - 在java swing中动态添加复选框

java - 无论连接 URL 为何,DriverManager 总是返回我的自定义驱动程序

c# - 是否可以尝试/捕获整个 C# 程序?

c# - 在 C# 中 try catch 属性的优雅方法是什么

java - 在 if else 循环中使用 try-catch