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