ITEM 71: 避免不必要的檢查異常

ITEM 71: AVOID UNNECESSARY USE OF CHECKED EXCEPTIONS
??許多Java程序員不喜歡檢查異常,但如果使用得當,它們可以改進 API 和程序流部。與返回代碼和未檢查的異常不同,它們迫使程序員處理問題,提高了可靠性舀透。與此同時,在 API 中過度使用受控異常會使它們使用起來非常不愉快决左。如果一個方法拋出檢查過的異常愕够,調用它的代碼必須在一個或多個 catch 塊中處理這些異常走贪,或者聲明它拋出這些異常并讓它們向外傳播。無論哪種方式惑芭,都會給 API 的用戶帶來負擔坠狡。Java 8 中的負擔增加了,因為拋出已檢查異常的方法不能直接在流中使用(item 45-48)遂跟。
??如果異常情況不能被 API 的正確使用所阻止逃沿,并且使用 API 的程序員在遇到異常時可以采取一些有用的操作,那么這種負擔可能是合理的幻锁。除非這兩個條件都滿足凯亮,否則不檢查異常是合適的。作為一個測試哄尔,問問你自己將如何處理異常触幼。這是我們能做到的最好的結果嗎?

} catch (TheCheckedException e) {
  throw new AssertionError(); // Can't happen!
}

??或者:

} catch (TheCheckedException e) { 
  e.printStackTrace(); // Oh well, we lose. 
  System.exit(1);
}

??如果程序員不能做得更好,使用未檢查的異常也許更好究飞。
??如果檢查異常是方法拋出的唯一檢查異常置谦,則由檢查異常給程序員造成的額外負擔將大大增加。如果還有其他異常亿傅,則該方法必須已經出現在 try 塊中媒峡,而這個異常最多需要另一個 catch 塊。如果方法拋出單個檢查異常葵擎,此異常是該方法必須出現在 try 塊中而不能直接在流中使用的唯一原因谅阿。在這種情況下,最好問問自己是否有辦法避免被檢查的異常酬滤。
??消除檢查異常的最簡單方法是返回所需結果類型的 Optional (item 55)签餐。該方法不拋出檢查異常,而只是返回一個空的結果盯串。這種技術的缺點是氯檐,該方法不能返回任何說明其無法執(zhí)行所需計算的額外信息。相反体捏,異常具有描述性類型冠摄,并且可以導出方法來提供額外的信息(item 70)。
??通過將拋出異常的方法分解為兩個方法几缭,還可以將檢查異常轉換為未檢查異常河泳,第一個方法返回一個布爾值,指示是否將拋出異常年栓。這個API重構將調用序列由

try { 
  obj.action(args);
} catch (TheCheckedException e) { 
  ... // Handle exceptional condition
}

??轉換為:

// Invocation with state-testing method and unchecked exception
if (obj.actionPermitted(args)) {
  obj.action(args); 
} else {
  ... // Handle exceptional condition 
}

??這種重構并不總是合適的拆挥,但在適當的地方,它可以使 API 使用起來更愉快某抓。雖然后一種調用序列并不比前一種更漂亮纸兔,但重構后的 API 更靈活惰瓜。如果程序員知道調用將成功,或者在調用失敗時滿足于讓線程終止食拜,重構也允許這個微不足道的調用序列:
obj.action(args);
??如果您懷疑普通的調用序列將是規(guī)范鸵熟,那么API重構可能是合適的。生成的API是聲明測試方法 API (item 69)應用相同的警告:如果一個對象是被并發(fā)地訪問沒有外部同步或受外部誘導狀態(tài)轉換负甸,這種重構是不恰當的流强,因為對象的狀態(tài)可能會在調用 actionPermitted 和 action 之間改變。如果一個單獨的 actionPermitted 會重復 action方法的工作呻待,那么基于性能原因打月,重構可能會被排除。
??總之蚕捉,當有節(jié)制地使用時奏篙,檢查異常可以提高程序的可靠性迫淹;當過度使用時秘通,它們會使 API 使用起來很痛苦。如果調用方無法從失敗中恢復敛熬,則拋出未檢查的異常肺稀。如果可能進行恢復,并且希望強制調用者處理異常條件应民,那么首先考慮返回一個Optional话原。只有在失敗的情況下,且需要提供足夠的信息時诲锹,才應該拋出檢查過的異常繁仁。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市归园,隨后出現的幾起案子黄虱,更是在濱河造成了極大的恐慌,老刑警劉巖蔓倍,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悬钳,死亡現場離奇詭異,居然都是意外死亡偶翅,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門碉渡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來聚谁,“玉大人,你說我怎么就攤上這事滞诺⌒蔚迹” “怎么了环疼?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長朵耕。 經常有香客問我炫隶,道長,這世上最難降的妖魔是什么阎曹? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任伪阶,我火速辦了婚禮,結果婚禮上处嫌,老公的妹妹穿的比我還像新娘栅贴。我一直安慰自己,他們只是感情好熏迹,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布檐薯。 她就那樣靜靜地躺著,像睡著了一般注暗。 火紅的嫁衣襯著肌膚如雪坛缕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天捆昏,我揣著相機與錄音赚楚,去河邊找鬼。 笑死屡立,一個胖子當著我的面吹牛直晨,可吹牛的內容都是我干的。 我是一名探鬼主播膨俐,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼勇皇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了焚刺?” 一聲冷哼從身側響起敛摘,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乳愉,沒想到半個月后兄淫,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蔓姚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年捕虽,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坡脐。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡泄私,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情晌端,我是刑警寧澤捅暴,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站咧纠,受9級特大地震影響蓬痒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜漆羔,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一梧奢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钧椰,春花似錦粹断、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诊沪,卻和暖如春养筒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背端姚。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工晕粪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吼和,地道東北人滤蝠。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓沸毁,卻偏偏與公主長得像削罩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子兴蒸,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345