1.異常處理相對(duì)于返回錯(cuò)誤代碼的一個(gè)最大優(yōu)點(diǎn)在于,異常可以被自動(dòng)傳遞,這樣,在編程時(shí)異常更加難以被忽視。
2.通常,只在最上層(一般是UI層)捕捉異常。如果要在其它層捕捉異常,除非是下列情況之一:
(1)能夠處理該異常,或者
(2)能夠忽略該異常,或者
(3)需要轉(zhuǎn)換該異常為其它特定異常后拋出新異常
3.UI層捕獲異常后,可以
(1)將無關(guān)緊要的異常忽略。
(2)將異常轉(zhuǎn)換為錯(cuò)誤信息展現(xiàn)給用戶。
(3)如果是重大異常,可以考慮終止應(yīng)用程序。
4.最上層(一般是UI層)不得拋出新的異常;最上層需要捕捉所有異常,否則異常會(huì)直接導(dǎo)致程序終止,這將是非常不好的用戶體驗(yàn)。
5.可以在非最上層拋出自定義異常。如果是自定義異常,請(qǐng)保證其是可序列化的,并且保證其實(shí)現(xiàn)了Exception的三個(gè)構(gòu)造函數(shù)。
6.異常的拋出與截獲需要很多的cpu時(shí)間,請(qǐng)謹(jǐn)慎的使用異常。
7.在可能拋出異常的地方,如果需要,請(qǐng)確保使用finally進(jìn)行資源清理,而無論此處是否捕捉了異常。
8.在一個(gè)catch塊中的代碼都應(yīng)該至少部分地處理了所捕捉的異常。否則,就不要使用catch塊。
9.從構(gòu)造函數(shù)中拋出異常。
因?yàn)闃?gòu)造函數(shù)沒有返回值,所以沒有簡(jiǎn)單的方法來想構(gòu)造函數(shù)的調(diào)用者發(fā)出構(gòu)造失敗的信號(hào),這時(shí)便可以通過拋出異常來做到。比如構(gòu)造參數(shù)與指定條件不符時(shí),就拋出一個(gè)異常。
10.在以上前提的保證下,可以在非最上層使用AOP截獲(intercept)異常而進(jìn)行日志記錄,這樣通過日志記錄,我們可以了解系統(tǒng)的 運(yùn)行狀態(tài)。記不起在哪里看到過這樣一句話:在軟件實(shí)現(xiàn)中,異常和日志都是重要的質(zhì)量保證手段,異常和日志總是同時(shí)出現(xiàn)的。
可以說,異常是日志記錄的重要/主要組成部分。