将try catch最终块放在另一个finally块内

问题描述

|
 try {
 } catch() {}
 finally {
     try {
     } catch() { }
     finally { }
 }
拥有上面的代码好吗?     

解决方法

是的,您可以这样做。 实际上,处理要正确关闭的流时甚至需要这样做:
InputStream in = /* ... */;
try {
} catch (...) {
} finally {
    try {
        in.close();
    } catch (...) {
    } finally {
    }
}
我看不到有任何不良做法     ,为了提高可读性,您可以将嵌套的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;
  }
}
    ,看起来很丑,但是有时候是要走的路。根据代码,考虑使用第二个try-catch-finally块提取方法。     ,最好在可能的情况下避免使用它,但是有时可能有必要。如果您告诉我们更多您为什么认为自己需要这样做的信息,我们可能会给出更好的答案:-) 考虑的原因之一可能是在提交操作本身可能引发异常的情况下在“ 4”块中提交事务。 重要的是要注意,除非正确处理,否则在finally块内引发的异常可能会轻易地掩盖在
try
块内较早引发的异常。因此,这种嵌套的try / catch块有时是可行的方法。但是,正如其他人指出的那样,为了提高可读性,建议将“ 4”块的内部提取到单独的方法中。     ,这很丑陋,但是在某些情况下您无法避免,特别是在资源清理中,如果您拥有依赖的资源,并且清理一种资源可能会引发异常。 一个典型的示例是用JDBC代码整理
ResultSet
Statement
Connection
对象。关闭
ResultSet
可能会引发异常,但是我们仍然想继续关闭
Statement
Connection