将try catch最终阻塞在另一个finally块中

时间:2011-05-23 10:03:35

标签: java try-catch

 try {
 } catch() {}
 finally {
     try {
     } catch() { }
     finally { }
 }

拥有上面的代码是否合适?

5 个答案:

答案 0 :(得分:29)

是的,你可以这样做。

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

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

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

答案 1 :(得分:10)

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

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

第二个try-catch可以在清理方法中。

为了支持IO包中的上述模式,JAVA6引入了一个名为Closeable的新类,所有流都实现了,因此您可以使用以下单个清理方法:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

最好尽可能避免它,但有时可能是必要的。如果你告诉我们你认为你需要这个的原因,我们可以给出更好的答案: - )

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

值得注意的是,除非正确处理,否则在finally块内抛出的异常可能很容易影响先前在try块内抛出的异常。因此,这种嵌套的try / catch块有时是要走的路。但是,正如其他人所指出的那样,为了提高可读性,建议将finally块的内部提取到单独的方法中。

答案 4 :(得分:1)

这很丑陋,但有些情况下你无法避免它,特别是在你拥有依赖资源的资源清理中,清理一个资源会引发异常。

典型示例是在JDBC代码中整理ResultSetStatementConnection个对象。关闭ResultSet会引发异常,但我们仍希望继续关闭StatementConnection