[英]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代碼中整理ResultSet
, Statement
和Connection
對象。 關閉ResultSet
可能會拋出異常,但我們仍然希望繼續並關閉Statement
和Connection
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.