【问题标题】:Java try-with-resource - log error with closing of resourceJava try-with-resource - 关闭资源时记录错误
【发布时间】:2017-06-20 16:58:48
【问题描述】:

我有以下:-

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

【问题讨论】:

    标签: java try-catch


    【解决方案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();
    }
    

    【讨论】:

    • 如果close() 抛出异常但try 主体没有抛出异常怎么办?我认为会记录错误的警告。
    • @SalvatoreElia 仅当您坚持每个日志记录语句都指定不同的消息时,但为什么需要这样做?无论哪种情况,都是 IOException,代码失败,异常会指定原因,堆栈跟踪会指定位置。
    • 我不知道为什么,但问题是日志消息不同。
    • @SalvatoreElia 我读到它会有所不同,因为异常不同,而不是因为日志文本不同。无论异常是来自构造函数还是read()方法,日志消息都是一样的,那么为什么close()方法的异常需要不同呢?
    • 嗯,也许我误会了。当我阅读问题时,听起来日志消息不同,但例外情况相同('2 个单独的日志警告')。
    猜你喜欢
    • 1970-01-01
    • 2016-08-18
    • 2020-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多