这种用于处理Java中的IO异常的模式是否正确?

 pengminglin1968 发布于 2023-02-13 19:34

在下面的代码片段中,如果抛出ex1,将被第二个catch块捕获,还是会被抛回到方法的调用者?

如果它被抛回到调用者,然后在finally块(ex2)中发生第二个异常,这是否意味着2个异常将被抛回调用者(ex1和ex2)?

try {
  // write to file
} catch (IOException ex1) {
  throw ex1;
} finally {
  try {
    aBufferedWriter.close();
  } catch (IOException ex2) {
    throw ex2;
  }
}

Jon Skeet.. 6

这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部try块的主体抛出然后close抛出,则调用者只能看到第二个异常.

然而,catch只是为了重新抛出一块就没有意义了.您的代码将更清晰:

try {
  // write to file
} finally {
  aBufferedWriter.close();
}

在Java 7中,try-with-resources语句可以自动执行此操作:

try (BufferedWriter writer = new BufferedWriter(...)) {
    // Use the writer here
} // The writer is auto-closed here

这样,你可以在与主体中的异常分开关闭时使用异常Throwable.getSuppressed.

1 个回答
  • 这两个例外都将被抛回调用者......虽然在任何特定情况下都是一个例外.如果外部try块的主体抛出然后close抛出,则调用者只能看到第二个异常.

    然而,catch只是为了重新抛出一块就没有意义了.您的代码将更清晰:

    try {
      // write to file
    } finally {
      aBufferedWriter.close();
    }
    

    在Java 7中,try-with-resources语句可以自动执行此操作:

    try (BufferedWriter writer = new BufferedWriter(...)) {
        // Use the writer here
    } // The writer is auto-closed here
    

    这样,你可以在与主体中的异常分开关闭时使用异常Throwable.getSuppressed.

    2023-02-13 19:37 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有