简化Java中的异常处理
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
#1. 不需要Checked異常 Java中的Checked異常,可以說(shuō)有弊無(wú)利,它除了能帶來(lái)一系列的麻煩,能干的事情Unchecked異常都能干。 ##1.1. 代碼污染 首先,當(dāng)一個(gè)方法聲明拋出一個(gè)Checked異常時(shí),該方法的后面就得加上throws XxxException;其次,該方法的調(diào)用者必須要處理這種異常:要么繼續(xù)拋出,調(diào)用方法也得加上throws XxxException;要么捕獲處理,處理方式可能是記錄日志、處理異常流或者再包裝一次拋出去;再次,當(dāng)方法增加另一個(gè)Checked異常時(shí),調(diào)用者也必須增加這個(gè)異常處理,否者代碼編譯都會(huì)出錯(cuò)。 ##1.2. 調(diào)用者未必需要或能夠處理這個(gè)異常 Checked異常強(qiáng)調(diào)調(diào)用者需要處理這種異常,但絕大部分情況是你根本不知道調(diào)用者是否真的需要,或者調(diào)用者是否有能力去處理這種異常。例如:SQLException,調(diào)用者除了能記錄日志或者包裝一下繼續(xù)拋出,還能做什么?在程序運(yùn)行過(guò)程中用代碼去修復(fù)錯(cuò)誤的SQL語(yǔ)法嗎? ##1.3. 都可以用Unchecked異常替代 Checked異常除了強(qiáng)制調(diào)用者捕獲處理以外,并不比Unchecked異常能夠攜帶更多信息。舉個(gè)常用的例子:用戶(hù)登錄,可能輸入錯(cuò)誤的用戶(hù)名或密碼,需要定義兩個(gè)異常:UserNotFoundException、PasswordNotMatchException。把這兩個(gè)異常定義為Checked異常看上去無(wú)可厚非了,調(diào)用者顯然是必須也能夠處理這兩個(gè)異常的。但反過(guò)來(lái)想,這兩個(gè)異常為什么不能定義為Unchecked異常呢?如果調(diào)用者需要分別提示用戶(hù)不同的信息,就分別捕獲處理;如果調(diào)用者需要統(tǒng)一提示用戶(hù):用戶(hù)名或密碼錯(cuò)誤,就一起捕獲處理;如果調(diào)用者本身就有一個(gè)頂層統(tǒng)一的異常處理機(jī)制呢,就讓它直接拋到頂層去處理好了。聰明的Shiro框架就是這么干的,所有的驗(yàn)證異常全部都是Unchecked異常。
#2. 不需要太多的異常 通常情況下,應(yīng)用這個(gè)層面的代碼只需要兩種異常:系統(tǒng)異常和業(yè)務(wù)異常。系統(tǒng)異常用來(lái)告訴用戶(hù):系統(tǒng)繁忙,請(qǐng)稍后再試(通常都是這么委婉,實(shí)際可能是某個(gè)BUG發(fā)作了 ^_^);業(yè)務(wù)異常,用來(lái)告訴用戶(hù)具體的業(yè)務(wù)操作提示信息(新增用戶(hù)時(shí),提示用戶(hù)名已存在之類(lèi)的),提示信息放在message屬性里就好了。兩種異常,也就是兩個(gè)異常類(lèi),它們可以處理掉80%-90%的異常。剩下的情況,只有當(dāng)需要對(duì)某種類(lèi)型的異常流程進(jìn)行特殊處理時(shí),才需要增加異常類(lèi)。例如對(duì)外開(kāi)放API接口時(shí),或許需要定義一個(gè)ApiException,用來(lái)返回錯(cuò)誤的消息。
#3. 把異常拋到頂層處理 應(yīng)用可能分很多層,在頂層設(shè)計(jì)一個(gè)異常處理框架來(lái)統(tǒng)一處理異常是明智的選擇。例如三層結(jié)構(gòu)的web應(yīng)用,應(yīng)該在表現(xiàn)層統(tǒng)一處理異常,而不是讓異常處理分布在各個(gè)層面,像Spring MVC、Struts這些MVC框架都有統(tǒng)一異常處理機(jī)制,用好它們就行了。 異常處理往往是開(kāi)發(fā)人員處理不好的一個(gè)環(huán)節(jié),而這個(gè)環(huán)節(jié)處理又會(huì)帶來(lái)比較大的麻煩,例如錯(cuò)誤的處理導(dǎo)致異常中斷了,最終連錯(cuò)誤日志都找不到。設(shè)計(jì)好一個(gè)頂層異常處理機(jī)制,然后告訴開(kāi)發(fā)人員不用處理異常,這樣可以盡可能的避免發(fā)生這樣的問(wèn)題。 正因如此,異常需要透?jìng)鞯巾攲?#xff0c;代碼又需要保持優(yōu)雅,所以Unchecked異常才是必然的選擇,優(yōu)秀的開(kāi)源框架都是這么干的。
轉(zhuǎn)載于:https://my.oschina.net/jnoee/blog/379980
總結(jié)
以上是生活随笔為你收集整理的简化Java中的异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 乘方取模计算(模幂计算)
- 下一篇: java美元兑换,(Java实现) 美元