技術(shù)分享 | Spring Boot 異常處理

  • Java 異常類
    首先讓我們簡單了解或重新學(xué)習(xí)下 Java 的異常機(jī)制只怎。

Java 內(nèi)部的異常類 Throwable 包括了 Exception 和 Error 兩大類噪生,所有的異常類都是 Object 對象。

Error 是不可捕捉的異常,通俗的說就是由于 Java 內(nèi)部 JVM 引起的不可預(yù)見的異常抱怔, Java 虛擬機(jī)會選擇終止線程。如 OutOfMemoryError ,就是 Java 虛擬機(jī)運行過程中出現(xiàn)內(nèi)存資源錯誤拋出的嘀倒。

Excetpion 異常是程序本身引起的屈留,它又分為運行時異常 RuntimeException,和非運行時(編譯時)IOException 等異常测蘑。如除數(shù)為零時引發(fā)的 ArrayIndexOutOfBoundException 異常就是運行時異常灌危。非運行異常都是可查可捕捉的。Java 編譯器會告訴程序他錯了碳胳,錯在哪里勇蝙,正確的建議什么。我們可以通過 throws 配合 try-catch 來處理挨约。

  • Java 異常處理機(jī)制
    在 Java 應(yīng)用程序中味混,異常處理機(jī)制為:拋出異常,捕捉異常烫罩。

拋出異常:當(dāng)一個方法出現(xiàn)錯誤引發(fā)異常時惜傲,方法創(chuàng)建異常對象并交付運行時系統(tǒng),異常對象中包含異常類型和出現(xiàn)異常時的程序運行時信息贝攒。運行時系統(tǒng)負(fù)責(zé)尋找處置異常的代碼并執(zhí)行盗誊。

捕獲異常:在方法拋出異常之后,運行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器(Exception Handler)隘弊。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合哈踱。

當(dāng)異常處理器能處理的異常類型與方法拋出的異常類型相符時,即為合適的異常處理器梨熙。運行時系統(tǒng)從發(fā)生異常的方法開始开镣,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行咽扇。
當(dāng)運行時系統(tǒng)遍歷調(diào)用棧而未找到合適 的異常處理器邪财,則運行時系統(tǒng)終止。同時质欲,意味著 Java 程序的終止树埠。

  • Spring Boot 異常處理
    Spring Boot 的所有異常處理都基于 java 的。

在 Spring Boot 應(yīng)用程序中嘶伟,通常統(tǒng)一處理異常的方法有 使用注解處理 RestControllerAdvice
本示例主要目的處理我們?nèi)粘?Spring Boot 中的異常處理

在 Web 項目中通過 ControllerAdvice怎憋、RestControllerAdvice 實現(xiàn)全局異常處理

ControllerAdvice 和 RestControllerAdvice 的區(qū)別 相當(dāng)于 Controller 和 RestController 的區(qū)別。

代碼示例

  • GlobalExceptionHandler.java
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ExceptionHandler({Exception.class})
    public Object exceptionHandler(Exception e){
        Map<String,Object> map=new HashMap<>();
        map.put("status",-1);
        map.put("msg",e.getLocalizedMessage());
        return map;
    }
}

  • 配置介紹
    RestControllerAdvice:全局捕獲異常,異常集中處理绊袋,更好的使業(yè)務(wù)邏輯與異常處理剝離開毕匀,定義在類上

ExceptionHandler:統(tǒng)一處理某一類異常,聲明該方法用于捕獲 value 所指的類型的異常(注意:當(dāng)該異常的子父類都被聲明時癌别,按照先子后父的順序進(jìn)行捕獲)

ResponseStatus:將某種異常映射為 HTTP 狀態(tài)碼皂岔,可用在方法上,也可以用在類上(自定義運行時異常類)规个。

  • HogwartsTestUserController.java
    在 HogwartsTestUserController.java 新增一個 error 接口
/**
     * 模擬拋出異常
     * */
    @GetMapping("/error")
    public Object err(){
        throw new RuntimeException("拋出一個異常");
    }

GET http://127.0.0.1:8081/api/user/users/3 正常返回

{
    "id": 3,
    "name": "HogwartsTest2",
    "pwd": "HogwartsTest2"
}

GET http://127.0.0.1:8081/api/user/error 拋出異常凤薛,并給出提示信息
{ "msg": "拋出一個異常", "status": -1 }

原文鏈接

更多技術(shù)文章

喜歡軟件測試的小伙伴們姓建,如果我的博客對你有幫助诞仓、如果你喜歡我的博客內(nèi)容,請 “點贊” “評論” “收藏” 一鍵三連哦速兔!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墅拭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涣狗,更是在濱河造成了極大的恐慌谍婉,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镀钓,死亡現(xiàn)場離奇詭異穗熬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丁溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門唤蔗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窟赏,你說我怎么就攤上這事妓柜。” “怎么了涯穷?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵棍掐,是天一觀的道長。 經(jīng)常有香客問我拷况,道長作煌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任赚瘦,我火速辦了婚禮粟誓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蚤告。我一直安慰自己努酸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布杜恰。 她就那樣靜靜地躺著获诈,像睡著了一般仍源。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舔涎,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天笼踩,我揣著相機(jī)與錄音,去河邊找鬼亡嫌。 笑死嚎于,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挟冠。 我是一名探鬼主播于购,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼知染!你這毒婦竟也來了肋僧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤控淡,失蹤者是張志新(化名)和其女友劉穎嫌吠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掺炭,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡辫诅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涧狮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炕矮。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勋篓,靈堂內(nèi)的尸體忽然破棺而出吧享,到底是詐尸還是另有隱情,我是刑警寧澤譬嚣,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布钢颂,位于F島的核電站,受9級特大地震影響拜银,放射性物質(zhì)發(fā)生泄漏殊鞭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一尼桶、第九天 我趴在偏房一處隱蔽的房頂上張望操灿。 院中可真熱鬧,春花似錦泵督、人聲如沸趾盐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽救鲤。三九已至久窟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本缠,已是汗流浹背斥扛。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留丹锹,地道東北人稀颁。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像楣黍,于是被迫代替她去往敵國和親匾灶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容