Java中的異常處理實(shí)踐

java中的異常說(shuō)起來(lái)簡(jiǎn)單,但是用起來(lái)卻完全不是你想象中的那么簡(jiǎn)單的,現(xiàn)在我來(lái)說(shuō)一下自己理解的具體情況的具體用法

Java中的異常大致分為兩類,可查的異常(checked exceptions)和不可查的異常(unchecked exceptions),說(shuō)白了可查異常就是必須try catch 的,不然編譯報(bào)錯(cuò),例如IOException、InterruptedException,不可查異常就是可以不用try catch,例如我們最熟悉的NullPointerException,只要繼承了RuntimeException都屬于不可查異常,現(xiàn)在說(shuō)一下我的經(jīng)驗(yàn)。

錯(cuò)誤示范1:遇到可查異常就try catch


image.png

比如以上代碼,大家覺(jué)得會(huì)有什么問(wèn)題嗎?想過(guò)嗎?如果插入隊(duì)列的時(shí)候真的出現(xiàn)了異常,那上層代碼也會(huì)認(rèn)為我執(zhí)行成功了,因?yàn)闆](méi)有報(bào)錯(cuò)呀,瞎執(zhí)行一通后造成各種各樣的邏輯錯(cuò)誤,可以看下圖的執(zhí)行,produce就算出現(xiàn)異常也會(huì)成功保存數(shù)據(jù)?到時(shí)候你找問(wèn)題就撲街了,為什么數(shù)據(jù)庫(kù)有數(shù)據(jù),隊(duì)列里就沒(méi)有呢?沒(méi)事,慢慢找吧

image.png

錯(cuò)誤示范2:萬(wàn)惡的printStackTrace
回到更能夠給的問(wèn)題,怎么找原因?誒, 我不是在catch里printStackTrace了嗎?看我多機(jī)智。好, 這個(gè)日志有100G,慢慢翻,如果再分布在100臺(tái)的服務(wù)器集群里,保證你懷疑人生,現(xiàn)代化企業(yè)級(jí)的項(xiàng)目里千萬(wàn)不要出現(xiàn)System.out.println輸出這種低級(jí)錯(cuò)誤,printStackTrace就是用了他,這些日志打出來(lái)連最根本的出錯(cuò)時(shí)間都沒(méi)有,更別談對(duì)日志進(jìn)行搜索了

說(shuō)完了錯(cuò)誤示范,那這些錯(cuò)誤怎么避免呢?什么時(shí)候該使用可查異常,什么時(shí)候該使用不可查異常呢?
錯(cuò)誤示范1里,我們盲目的捕抓異常,錯(cuò)誤示范2里,異常沒(méi)有正確處理,后果很?chē)?yán)重,但是異常處理和實(shí)際業(yè)務(wù)關(guān)聯(lián)性是非常強(qiáng)的,我也不能說(shuō)出一套通用的解決方案,我說(shuō)一下特定情況下的特定解決方案。

我們必須告訴上層調(diào)用這次執(zhí)行失敗了,方法如下圖


image.png

這樣上層調(diào)用在出現(xiàn)此異常時(shí)就不會(huì)向下執(zhí)行錯(cuò)誤的邏輯,但其實(shí)還是有一個(gè)問(wèn)題,因?yàn)檫@是一個(gè)可查異常,上層調(diào)用代碼必須要對(duì)這個(gè)異常做出處理,繼續(xù)往上拋還是捕抓,其實(shí)我個(gè)人是不喜歡使用可查異常的,這也是其中一個(gè)很重要的原因,上層調(diào)用必須因?yàn)槟愕漠惓<尤胍恍┎槐匾拇a,所以我的修改是

image.png

這樣上層調(diào)用就不需要因?yàn)檎{(diào)用了這里的代碼而必須做出一些改變了,當(dāng)然是用RuntimeException還是有一點(diǎn)爭(zhēng)議的,你可以替換成你自己的自定義異常,但是一定要是集成RuntimeException的

當(dāng)有一些異常我們必須要處理的時(shí)候怎么辦呢?

image.png

我們有一個(gè)這樣的操作,當(dāng)請(qǐng)求失敗后,捕抓異常,把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)里,也不是所有的異常都需要往外拋,但是我還是建議可以加上日志,有利于日后排查問(wèn)題。

image.png

結(jié)論

異常本質(zhì)上就是這一行代碼告訴我他執(zhí)行出錯(cuò)了,你自己看著辦吧。這異常我沒(méi)法處理,交給上面的老大哥吧,或者你覺(jué)得這個(gè)異常是在我的接受范圍內(nèi)的,我可以處理。我覺(jué)得最經(jīng)典的使用案例就在我們的事務(wù)管理上,事務(wù)老大哥會(huì)根據(jù)下面的小弟反饋有沒(méi)有異常判斷是提交還是回滾,如果有些不聽(tīng)話的小弟把本應(yīng)該要回滾的異常吃掉了,事務(wù)老大哥不知道,后果就很?chē)?yán)重了。你做不了決定,就交給你上面的老大哥吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容