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

时间:2017-06-20 16:58:49

标签: 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子句和资源关闭都抛出相同的异常可能会使维护这两个单独的记录器警告变得棘手? 提前谢谢你

1 个答案:

答案 0 :(得分:1)

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

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

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

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