如果你有一些需要運行的清理代碼,無論是否拋出異常,try { ... } finally { ... }
就是你需要的。但是如果你想讓這個清理代碼只在發生異常時才運行呢?習慣性的Java「finally」塊只能運行在異常處
一個可能的解決方案是這樣的:
boolean ok = false;
try {
doWork();
ok = true;
} finally {
if (!ok) {
doCleanup();
}
}
它確實正是我想要的,但我想知道是否有表達的想法更自然的方式。
這種替代不鼓起傳遞:
try {
doWork();
} catch (Throwable e) {
doCleanup();
throw e; // BAD: Cant do this unless the enclosing function is declared to throw Throwable
}
我想我能趕上例外,而不是Throwable的,但我不喜歡這個主意,一個非異常拋出將繞過清理代碼。畢竟,即使對於非拋出異常,常規的finally
塊仍然運行。
旁白:在C++中,您只需使用一個包羅萬象的塊:
try {
doWork();
} catch (...) {
doCleanup();
throw;
}
你第一個選擇應該工作正常。你不需要聲明你正在拋出'Throwable'。 – azurefrog 2014-10-29 21:15:03