簡體   English   中英

將try catch最終阻塞在另一個finally塊中

[英]Putting try catch finally block inside another finally block

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

擁有上面的代碼是好的嗎?

是的,你可以這樣做。

實際上,在處理要正確關閉的流時,甚至需要執行此操作:

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

我認為這不是一種不好的做法

為了便於閱讀,您可以將嵌套的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;
  }
}

看起來很丑,但有時它是要走的路。 根據代碼考慮使用第二個try-catch-finally塊提取方法。

最好盡可能避免它,但有時可能是必要的。 如果你告訴我們更多關於你認為你需要這個的原因,我們可能會給出更好的答案:-)

考慮的一個原因可能是在finally塊中提交事務,此時提交操作本身可能會拋出異常。

值得注意的是,除非正確處理,否則在finally塊中拋出的異常可能很容易影響try塊中之前拋出的異常。 因此,這種嵌套的try / catch塊有時是要走的路。 但是,正如其他人所指出的那樣,為了提高可讀性,建議將finally塊的內部提取到單獨的方法中。

這很丑陋,但有些情況下你無法避免它,特別是在你擁有依賴資源的資源清理中,清理一個資源會引發異常。

一個典型的例子是在JDBC代碼中整理ResultSetStatementConnection對象。 關閉ResultSet可能會拋出異常,但我們仍然希望繼續並關閉StatementConnection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM