SpringBoot統(tǒng)一異常處理

軟件開發(fā)過程中有一大半的時間都是在處理各種異常情況,并且各種異常還防不勝防杯道,稍有不慎就會有遺漏。導(dǎo)致代碼中出現(xiàn)大量的try {...} catch {...} finally {...}代碼塊唯灵,不僅難易維護钝鸽,并且也不優(yōu)雅,會被其他接手同學(xué)背后喊罵唾那,甚至自己都會覺得寫的太爛了访锻。這種情況SpringBoot框架當(dāng)然也有想到,因此Spring3.2增加了@ControllerAdvice結(jié)合@ExceptionHandler進行全局異常處理闹获,接下來將詳細(xì)介紹全局統(tǒng)一異常處理的方法

Spring在3.2版本增加了@ControllerAdvice期犬,可以與@ExceptionHandler、@InitBinder避诽、@ModelAttribute等注解配套使用龟虎,對于異常處理使用@ExceptionHandler即可

直觀的想法就是在每個Controller定義一套異常處理方法(由于每個Controller的異常有可能不一樣,且數(shù)量眾多)茎用,并在方法上增加@ExceptionHandler注解遣总,當(dāng)出現(xiàn)各種異常是,就可以使用該方法進行處理轨功,這種方案想想都不優(yōu)雅旭斥,需要每個Controller都處理,升級方法就是繼承BaseController之類的古涧,但是也不優(yōu)雅垂券,一個簡單的Controller竟然需要繼承,如果還有其他基類需要繼承則該方案就行不通了羡滑。針對這種困惑菇爪,SpringBoot也想到了即是用@ControllerAdvice,該注解可以把異常處理器應(yīng)用到所有的Controller而不是單個的柒昏,基于該注解(只需要在類簽名增加該注解)凳宙,可以單獨定義一個異常處理類,在類中定義一套各種的異常處理機制职祷,就可以統(tǒng)一對不同階段氏涩、不同異常進行處理,避免重復(fù)的冗余代碼有梆,也避免遺漏一些異常是尖,更避免了頻繁修改代碼。

@RestControllerAdvice + @ExceptionHandler 統(tǒng)一全局異常處理

本文介紹@RestControllerAdvice(=@ControllerAdvice + @ResponseBody) + @ExceptionHandler進行全局的Controller層異常處理泥耀,避免在Controller層進行大量的try-catch饺汹,而且可以結(jié)合@Validation注解校驗器一起處理,無需手動判斷綁定校驗結(jié)果BindingResult/Errors

優(yōu)缺點

優(yōu)點:將Controller層的異常和數(shù)據(jù)校驗的異常進行統(tǒng)一處理痰催,減少模板代碼兜辞,減少編碼量迎瞧,提升擴展性和可維護性
缺點:只能處理Controller層未捕獲(往外拋)的異常,對于Interceptor(攔截器)層的異常弦疮,Spring框架層的異常夹攒,就無能為力了

使用實例

@RestControllerAdvice定義全局異常處理類

@RestControllerAdvice
public class GlobalExceptionHandler {
}

請確保GlobalExceptionHandler類能被掃描到并裝載進Spring容器中

@ExceptionHandler注解聲明異常處理方法

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    public Object exceptionHandler(Exception e) {
        log.error(e.getMessage, e);
        return "Exception ..."; // 可以根據(jù)具體場景調(diào)整返回數(shù)據(jù)結(jié)構(gòu)體
    }
}

該exceptionHandler會自動處理Controller層拋出的Exception及其子類的異常,參數(shù)Exception就是Controller拋出的異常

處理自定義異常

@RestControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(BusinessException.class)
    public Object exceptionHandler(BusinessException e) {
        log.error(e.getMessage, e);
        return "BusinessException ..."; // 可以根據(jù)具體場景調(diào)整返回數(shù)據(jù)結(jié)構(gòu)體
    }
}

public class BusinessException extends RuntimeException {

    public BusinessException(String message) {
        super(message);
    }

    public BusinessException(String message, Throwable th) {
        super(message, th);
    }
}

參考

統(tǒng)一異常處理介紹及實戰(zhàn)
使用@ControllerAdvice + @ExceptionHandler 全局處理Controller 層異常
Spring進階之@ControllerAdvice與統(tǒng)一異常處理
優(yōu)雅的處理你的Java異常

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胁塞,一起剝皮案震驚了整個濱河市咏尝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啸罢,老刑警劉巖编检,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異扰才,居然都是意外死亡允懂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門衩匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕾总,“玉大人,你說我怎么就攤上這事琅捏∩伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵柄延,是天一觀的道長蚀浆。 經(jīng)常有香客問我,道長搜吧,這世上最難降的妖魔是什么市俊? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮滤奈,結(jié)果婚禮上摆昧,老公的妹妹穿的比我還像新娘。我一直安慰自己蜒程,他們只是感情好绅你,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著搞糕,像睡著了一般勇吊。 火紅的嫁衣襯著肌膚如雪曼追。 梳的紋絲不亂的頭發(fā)上窍仰,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音礼殊,去河邊找鬼驹吮。 笑死针史,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碟狞。 我是一名探鬼主播啄枕,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼族沃!你這毒婦竟也來了频祝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤脆淹,失蹤者是張志新(化名)和其女友劉穎常空,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盖溺,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡漓糙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了烘嘱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆禽。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蝇庭,靈堂內(nèi)的尸體忽然破棺而出醉鳖,到底是詐尸還是另有隱情,我是刑警寧澤遗契,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布辐棒,位于F島的核電站,受9級特大地震影響牍蜂,放射性物質(zhì)發(fā)生泄漏漾根。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一鲫竞、第九天 我趴在偏房一處隱蔽的房頂上張望辐怕。 院中可真熱鬧,春花似錦从绘、人聲如沸寄疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陕截。三九已至,卻和暖如春批什,著一層夾襖步出監(jiān)牢的瞬間农曲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乳规,地道東北人形葬。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像暮的,于是被迫代替她去往敵國和親笙以。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355