ITEM 77: DON’T IGNORE EXCEPTIONS
??雖然這個建議看起來很明顯,但它經(jīng)常被違背唇礁,因此需要重復(fù)掉奄。當(dāng)API的設(shè)計者聲明一個拋出異常的方法時,他們試圖告訴你一些事情矾飞,不要忽略它!用一個catch塊為空的try語句包圍方法調(diào)用呀邢,很容易忽略異常:
// Empty catch block ignores exception - Highly suspect!
try { ...
} catch (SomeException e) {
}
??空catch塊無法實現(xiàn)異常的目的洒沦,即強迫您處理異常條件。忽略異常類似于忽略火警警報价淌,并將其關(guān)閉申眼,這樣其他人就沒有機會看到是否真的發(fā)生了火災(zāi)。你可能會僥幸逃脫蝉衣,或者結(jié)果可能是災(zāi)難性的括尸。每當(dāng)你看到一個空的捕捉塊,警鐘應(yīng)該在你的頭腦中響起病毡。
??在某些情況下濒翻,忽略異常是合適的。例如啦膜,在關(guān)閉 FileInputStream 時有送,它可能是合適的。您沒有更改文件的狀態(tài)僧家,因此不需要執(zhí)行任何恢復(fù)操作雀摘,并且您已經(jīng)從文件中讀取了所需的信息,因此沒有理由中止正在進行的操作八拱。記錄異痴笤可能是明智的烁落,這樣您就可以在這些異常經(jīng)常發(fā)生時調(diào)查問題。如果你選擇忽略異常豌注,catch 塊應(yīng)該包含一個解釋為什么這樣做是合適的注釋,變量應(yīng)該命名為 ignore:
Future<Integer> f = exec.submit(planarMap::chromaticNumber);
int numColors = 4; // Default; guaranteed sufficient for any map
try {
numColors = f.get(1L, TimeUnit.SECONDS);
} catch (TimeoutException | ExecutionException ignored) {
// Use default: minimal coloring is desirable, not required
}
??本項目中的建議同樣適用于已檢查的異常和未檢查的異常灯萍。無論異常是表示可預(yù)測的異常情況還是編程錯誤轧铁,使用空catch塊忽略它都會導(dǎo)致程序在出現(xiàn)錯誤時靜默地繼續(xù)運行。程序可能會在將來的任意時間失敗旦棉,在代碼中與問題的根源沒有明顯關(guān)系的一點上齿风。正確處理異常可以完全避免失敗绑洛。僅僅讓異常向外傳播至少會導(dǎo)致程序快速失敗救斑,從而保留信息來幫助調(diào)試失敗。