【问题标题】:Putting try catch finally block inside another finally block将 try catch finally 块放入另一个 finally 块中
【发布时间】:2011-08-31 00:58:14
【问题描述】:
 try {
 } catch() {}
 finally {
     try {
     } catch() { }
     finally { }
 }

上面的代码好不好?

【问题讨论】:

标签: java try-catch


【解决方案1】:

是的,你可以这样做。

实际上,在处理要正确关闭的流时,您甚至需要这样做:

InputStream in = /* ... */;
try {
} catch (...) {
} finally {
    try {
        in.close();
    } catch (...) {
    } finally {
    }
}

我不认为这是一种不好的做法

【讨论】:

  • 很好的例子。但我一直认为这是难以阅读的代码,并尝试创建一些 util 方法或类,可以通过 null 检查关闭 Closeable 实例。
【解决方案2】:

为了可读性,您可以将嵌套的 try-catch 分解为单独的方法,例如:

  try{
  }catch(){}
  finally{
    cleanup();
  }

第二个try-catch可以在cleanup方法里面。

为了在 IO 包中支持上述模式,JAVA6 引入了一个名为 Closeable 的新类,所有流都实现了,这样您就可以有一个单一的清理方法,如下所示:

public static boolean cleanup(Closeable stream)
{
try{
    stream.close();
    return true;
  }catch(){
    return false;
  }
}

【讨论】:

    【解决方案3】:

    最好尽量避免,但有时可能是必要的。如果您告诉我们更多关于您认为需要此功能的原因,我们可能会给出更好的答案:-)

    考虑的一个原因可能是在finally 块中提交事务,此时提交操作本身可能会引发异常。

    请务必注意,除非处理得当,否则在 finally 块中抛出的异常可能很容易掩盖之前在 try 块中抛出的异常。因此,这种嵌套的 try/catch 块有时是可行的方法。但是,正如其他人所指出的,为了提高可读性,建议将 finally 块的内部提取到单独的方法中。

    【讨论】:

      【解决方案4】:

      看起来很丑,但有时这是要走的路。根据代码考虑使用第二个 try-catch-finally 块提取方法。

      【讨论】:

        【解决方案5】:

        这很丑陋,但在某些情况下您无法避免,尤其是在资源清理中,您有依赖资源并且清理一个资源可能会引发异常。

        一个典型的例子是整理 JDBC 代码中的 ResultSetStatementConnection 对象。关闭ResultSet 可能会引发异常,但我们仍然希望继续并关闭StatementConnection

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-05
          • 2013-12-16
          • 2011-06-01
          • 1970-01-01
          • 2012-03-06
          • 1970-01-01
          • 2014-11-27
          • 1970-01-01
          相关资源
          最近更新 更多