盡管這條建議看上去是顯而易見的,但是它卻常常被違反勇劣,因此值得再次提出來。當(dāng)API的設(shè)計(jì)者聲明一個(gè)方法將拋出某個(gè)異常的時(shí)候潭枣,它們等于正在視圖說明某些事情比默。所以,請不要忽略它盆犁!要忽略一個(gè)異常非常容易命咐,只需將方法調(diào)用通過try語句包圍起來,并包含一個(gè)空的catch塊:
// Empty catch block ignores exception - Highly suspect!
try { ...
} catch (SomeException e) {
}
空的catch塊會(huì)使異常達(dá)不到應(yīng)有的目的
谐岁,即強(qiáng)迫你處理異常的情況醋奠。忽略異常就如同忽略火警信號一樣,如果把火警信號關(guān)掉了伊佃,當(dāng)真正有火災(zāi)發(fā)生時(shí)窜司,就沒有人能看到火警信號了『饺啵或許你會(huì)僥幸逃過劫難塞祈,或許結(jié)果將是災(zāi)難性的。每當(dāng)見到空的catch塊時(shí)帅涂,應(yīng)該讓警鐘長鳴议薪。
有些情形可以忽略異常。比如媳友,關(guān)閉FileInputStream的時(shí)候斯议。因?yàn)槟氵€有沒有改變文件的狀態(tài),因此不必執(zhí)行任何恢復(fù)動(dòng)作醇锚,并且已經(jīng)從文件中讀取到所有的信息哼御,因此不必終止正在進(jìn)行的操作。即使在這種情況下焊唬,把異常記錄下來還是明智的做法艇搀,因?yàn)槿绻@些異常經(jīng)常發(fā)生,你就可以調(diào)查異常的原因求晶。如果選擇忽略異常焰雕,catch塊中應(yīng)該包含一條注釋,說明為什么可以這么做芳杏,并且變量應(yīng)該命名為ignored
:
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ù)見的異常條件辟宗,還是編程錯(cuò)誤,用空的catch塊忽略吝秕,都將導(dǎo)致程序在遇到錯(cuò)誤的情況下悄然地執(zhí)行下去泊脐。然后,有可能在將來地某個(gè)點(diǎn)上烁峭,當(dāng)程序不能再容忍與錯(cuò)誤源明顯相關(guān)地問題時(shí)容客,它就會(huì)失敗。正確地處理異常能夠徹底避免失敗约郁。只要將異常傳播給外界缩挑,至少會(huì)導(dǎo)致程序迅速失敗,從而保留了有助于調(diào)式該失敗條件地信息鬓梅。