摘要:非檢查異常是不需要在子句中聲明的異常。在高執(zhí)行級(jí)別,應(yīng)記錄此類異常。是最為嚴(yán)重的運(yùn)行時(shí)錯(cuò)誤,幾乎是不可能恢復(fù)和處理,一些示例是,和。捕獲異常時(shí),也不要捕獲范圍太大,例如捕獲,相反,只捕獲你能處理的異常,應(yīng)該處理的異常。
摘要: 簡(jiǎn)單實(shí)用的建議。
原文:Java異常處理12條軍規(guī)
公眾號(hào):Spring源碼解析
Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。
在Java語(yǔ)言中,異常從使用方式上可以分為兩大類:
CheckedException
UncheckedException
在Java中類的異常結(jié)構(gòu)圖如下:
可檢查異常需要在方法上聲明,一般要求調(diào)用者必須感知異??赡馨l(fā)生,并且對(duì)可能發(fā)生的異常進(jìn)行處理。可以理解成系統(tǒng)正常狀態(tài)下很可能發(fā)生的情況,通常發(fā)生在通過(guò)網(wǎng)絡(luò)調(diào)用外部系統(tǒng)或者使用文件系統(tǒng)時(shí),在這種情況下,錯(cuò)誤是可能恢復(fù)的,調(diào)用者可以根據(jù)異常做出必要的處理,例如重試或者資源清理等。
非檢查異常是不需要在throws子句中聲明的異常。JVM根本不會(huì)強(qiáng)制您處理它們,因?yàn)樗鼈冎饕怯捎诔绦蝈e(cuò)誤而在運(yùn)行時(shí)生成的。它們擴(kuò)展了RuntimeException。最常見的例子是NullPointerException 可能不應(yīng)該重試未經(jīng)檢查的異常,并且正確的操作通常應(yīng)該是什么都不做,并讓它從您的方法和執(zhí)行堆棧中出來(lái)。在高執(zhí)行級(jí)別,應(yīng)記錄此類異常。
Error是最為嚴(yán)重的運(yùn)行時(shí)錯(cuò)誤,幾乎是不可能恢復(fù)和處理,一些示例是OutOfMemoryError,LinkageError和StackOverflowError。它們通常會(huì)使程序或程序的一部分崩潰。只有良好的日志記錄練習(xí)才能幫助您確定錯(cuò)誤的確切原因.
在異常處理時(shí)的幾點(diǎn)建議:
1. 永遠(yuǎn)不要catch中吞掉異常,否則在系統(tǒng)發(fā)生錯(cuò)誤時(shí),你永遠(yuǎn)不知道到底發(fā)生了什么catch (SomeException e) { return null; }2. 盡量使用特定的異常而不是一律使用Exception這樣太泛泛的異常
public void foo() throws Exception { //錯(cuò)誤的做法}
public void foo() throws MyBusinessException1, MyBusinessException2 { //正確的做法}
一味的使用Exception,這樣就違背了可檢查異常的設(shè)計(jì)初衷,因?yàn)檎{(diào)用都不知道Exception到底是什么,也不知道該如何處理。捕獲異常時(shí),也不要捕獲范圍太大,例如捕獲Exception,相反,只捕獲你能處理的異常,應(yīng)該處理的異常。即然方法的聲明者在方法上聲明了不同類型的可檢查異常,他是希望調(diào)用者區(qū)別對(duì)待不同異常的。
3. Never catch Throwable class?永遠(yuǎn)不要捕獲Throwable,因?yàn)镋rror也是繼承自它,Error是Jvm都處理不了的錯(cuò)誤,你能處理?所以基于有些Jvm在Error時(shí)就不會(huì)讓你catch住。
4. 正確的封裝和傳遞異常**不要丟失異常棧,因?yàn)楫惓?duì)于定位原始錯(cuò)誤很關(guān)鍵
catch (SomeException e) {throw new MyServiceException("Some information: " + e.getMessage()); //錯(cuò)誤的做法}
一定要保留原始的異常:
catch (SomeException e) { throw new MyServiceException("Some information: " , e); //正確的打開方式}5. 要打印異常,就不要拋出,不要兩者都做
catch (SomeException e) { LOGGER.error("Some information", e); throw e; }
這樣的log沒(méi)有任何意義,只會(huì)打印出一連串的error log,對(duì)于定位問(wèn)題無(wú)濟(jì)于事。
6. 不要在finally塊中拋出異常如果在finally中拋出異常,將會(huì)覆蓋原始的異常,如果finally中真的可能會(huì)發(fā)生異常,那一定要處理并記錄它,不要向上拋。
7. 不要使用printStackTrace要給異常添加上有用的上下文信息,單純的異常棧,沒(méi)有太大意義
8. Throw early catch late異常界著名的原則,錯(cuò)誤發(fā)生時(shí)及早拋出,然后在獲得所以全部信息時(shí)再捕獲處理.也可以理解為在低層次拋出的異常,在足夠高的抽象層面才能更好的理解異常,然后捕獲處理。
9. 對(duì)于使用一些重量級(jí)資源的操作,發(fā)生異常時(shí),一定記得清理如網(wǎng)絡(luò)連接,數(shù)據(jù)庫(kù)操作等,可以用try finally來(lái)做clean up的工作。
10. 不要使用異常來(lái)控制程序邏輯流程我們總是不經(jīng)意間這么做了,這樣使得代碼變更丑陋,使得正常業(yè)務(wù)邏輯和錯(cuò)誤處理混淆不清;而且也可能會(huì)帶來(lái)性能問(wèn)題,因?yàn)楫惓J莻€(gè)比較重的操作。
11. 及早校驗(yàn)用戶的輸入在最邊緣的入口校驗(yàn)用戶的輸入,這樣使得我們不用再更底層邏輯中處處校驗(yàn)參數(shù)的合法性,能大大簡(jiǎn)化業(yè)務(wù)邏輯中不必要的異常處理邏輯;相反,在業(yè)務(wù)中不如果擔(dān)心參數(shù)的合法性,則應(yīng)該使用衛(wèi)語(yǔ)句拋出運(yùn)行時(shí)異常,一步步把對(duì)參數(shù)錯(cuò)誤的處理推到系統(tǒng)的邊緣,保持系統(tǒng)內(nèi)部的清潔。
12. 在打印錯(cuò)誤的log中盡量在一行中包含盡可能多的上下文LOGGER.debug("enter A");LOGGER.debug("enter B"); //錯(cuò)誤的方式
LOGGER.debug("enter A, enter B");//正確的方式
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77572.html
摘要:字囊括上百個(gè)前端面試題的項(xiàng)目開源了這個(gè)項(xiàng)目是什么項(xiàng)目?jī)?nèi)容這個(gè)項(xiàng)目目前在上剛剛開源主要內(nèi)容如下前端面試題主要整理了高頻且有一定難度的前端面試題對(duì)這些面試題進(jìn)行解讀前端原理詳解針對(duì)一些有一定難度面試題涉及的知識(shí)點(diǎn)進(jìn)行詳解比如涉及的編譯原理響應(yīng)式 20W字囊括上百個(gè)前端面試題的項(xiàng)目開源了 這個(gè)項(xiàng)目是什么? 項(xiàng)目?jī)?nèi)容 這個(gè)項(xiàng)目目前在GitHub上剛剛開源,主要內(nèi)容如下: 前端面試題: 主要整...
摘要:避免重定向重定向用和狀態(tài)碼,下面是一個(gè)有狀態(tài)碼的頭瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)到域指明的。除此之外還有別的跳轉(zhuǎn)方式元標(biāo)簽和,但如果你必須得做重定向,最好用標(biāo)準(zhǔn)的狀態(tài)碼,主要是為了讓返回按鈕能正常使用。要提高性能,優(yōu)化這些響應(yīng)至關(guān)重要。 showImg(https://segmentfault.com/img/bVbmMsz?w=652&h=367);一直以來(lái),性能優(yōu)化是開發(fā)的重中之中,而提及 前端...
摘要:避免重定向重定向用和狀態(tài)碼,下面是一個(gè)有狀態(tài)碼的頭瀏覽器會(huì)自動(dòng)跳轉(zhuǎn)到域指明的。除此之外還有別的跳轉(zhuǎn)方式元標(biāo)簽和,但如果你必須得做重定向,最好用標(biāo)準(zhǔn)的狀態(tài)碼,主要是為了讓返回按鈕能正常使用。要提高性能,優(yōu)化這些響應(yīng)至關(guān)重要。 showImg(https://segmentfault.com/img/bVbmMsz?w=652&h=367);一直以來(lái),性能優(yōu)化是開發(fā)的重中之中,而提及 前端...
閱讀 1275·2023-04-26 01:38
閱讀 1472·2021-11-15 11:39
閱讀 3264·2021-09-22 15:43
閱讀 2659·2019-08-30 15:55
閱讀 2059·2019-08-30 14:17
閱讀 2861·2019-08-29 14:16
閱讀 3072·2019-08-26 18:36
閱讀 2616·2019-08-26 12:19