springboot捕獲全局異常實現(xiàn)過程
學(xué)習(xí)目標(biāo)
java中的異常和錯誤
學(xué)習(xí)內(nèi)容
- 首頁要了解什么是異常什么是錯誤
- 捕捉全局異常
- 自定義異常
java中異常和錯誤的區(qū)別
Error類和Exception類的父類都是throwable類: 他們的區(qū)別是:
- Error類一般是指與虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰,虛擬機(jī)錯誤,內(nèi)存空間不足,方法調(diào)用棧溢等。對于這類錯誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序本身無法恢復(fù)和和預(yù)防,遇到這樣的錯誤,建議讓程序終止。
- Exception類表示程序可以處理的異常,可以捕獲且可能恢復(fù)。遇到這類異常,應(yīng)該盡可能處理異常,使程序恢復(fù)運行,而不應(yīng)該隨意終止異常。
常見的異常 :
- ArrayIndexOutOfBoundsException 數(shù)組下標(biāo)越界異常,
- ArithmaticException 算數(shù)異常 如除數(shù)為零
- NullPointerException 空指針異常
- IllegalArgumentException 不合法參數(shù)異常
直接上代碼
public class exception {
public static void main(String[] args) {
exception01();
}
public static void exception01(){
int i =1/0;
}
}
結(jié)果是:算數(shù)異常,如果直接讓用戶看見異常信息不友好

改造一下寫法:把異常捕獲,這樣就不會看見異常信息,這里寫的有些問題 不應(yīng)該寫Execption,這個異常都所有異常的父類,應(yīng)該寫對應(yīng)的異常,算數(shù)異常是 arithmeticExecption

真正的項目里發(fā)生異常該怎么捕獲呢?下面就來了解一下全局異常,創(chuàng)建springboot項目
1.創(chuàng)建一個controller包,里面寫了一個異常方法,
2.配置swagger-ui來進(jìn)行接口的訪問
@GetMapping("exception")
public R exception(){
throw new RuntimeException("運行異常");
}
結(jié)果肯定是報錯,但是這個異常是可以人工干預(yù)的,避免控制臺輸出報錯信息,或者把報錯解釋的詳細(xì)一點

創(chuàng)建一個MyExceptionHandler類,這個類就是來幫我們捕獲全局異常的類,
1.在這個類上加上@RestControllerAdvice注解
2.創(chuàng)建一個方法
3.在方法上加上@ExceptionHandler注解中可以添加參數(shù),參數(shù)是某個異常類的class,代表這個方法 專門處理該類異常,比如這樣:,
@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {
@ExceptionHandler(value = Exception.class)
public String exceptionHandler(Exception e){
log.error("未知異常!原因是:"+e.getMessage());
return "未知錯誤?。?!";
}
}
繼續(xù)訪問異常的接口,沒有報錯了,返回的結(jié)果也我定義的數(shù)據(jù)

控制臺也輸出異常信息

到這異常的捕獲就完成了,但是我們捕獲都是系統(tǒng)自帶的異常,我就在想能不能自定義異常,然后進(jìn)行捕獲,開干
實現(xiàn)步驟:
- 創(chuàng)建一個枚舉進(jìn)行異常傳遞
- 創(chuàng)建一個自定義的異常類取名叫CustomException,
- 在MyExceptionHandler全局異常中把自定義異常捕獲
枚舉
@Getter
@AllArgsConstructor
public enum RCode {
SUCCESS(0,"操作成功!"),
fail(1,"操作失敗!"),
AUTH_ERROR(40411,"用戶名或密碼不存在!"),
NO_AUTH_ERROR(40412,"無權(quán)訪問!"),
SYS_VALID_ERROR(501,"參數(shù)校驗錯誤"),
SYS_EXCEPTION(2,"模擬異常"),
INVALID_TOKEN(40410,"Token無效,您無權(quán)訪問該接口"),
;
private Integer code;
private String msg;
}
CustomException類
@Getter
public class CustomException extends RuntimeException{
private RCode rCode;
public CustomException(RCode rCode) {
this.rCode = rCode;
}
public CustomException(Throwable cause, RCode rCode) {
super(cause);
this.rCode = rCode;
}
}
在全局異常類中捕獲
@RestControllerAdvice
@Slf4j
public class MyExceptionHandler {
//捕獲自定義異常
@ExceptionHandler(value = CustomException.class)
public R CustomerExceptionHandler(CustomException e){
log.error("未知異常!原因是:"+e.getRCode().getMsg());
return R.error(e.getRCode());
}
}
進(jìn)行測試:首頁修改controller中接口拋出的異常 換成我們自己定義的異常類

進(jìn)行測試:結(jié)果

控制臺:

總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java出現(xiàn):JWT strings must contain exactly&
這篇文章主要介紹了JWT令牌解析失敗的原因和解決方法,包括Header、Payload和Signature三段式結(jié)構(gòu),常見錯誤原因,通用解決方案以及額外注意點,需要的朋友可以參考下2026-01-01
Spring使用 AsyncConfigurer 自定義線程池實現(xiàn)高效異步任務(wù)管理
Spring框架的@Async注解雖然提供了異步任務(wù)支持,但默認(rèn)線程池不適合生產(chǎn)環(huán)境,通過自定義線程池配置類實現(xiàn)AsyncConfigurer接口,可以統(tǒng)一管理線程池參數(shù),解決企業(yè)級應(yīng)用中線程爆炸、拒絕策略和可觀測性等問題,下面就來介紹一下如何實現(xiàn)2026-02-02
Eclipse安裝Aptana插件(注意對應(yīng)版本問題)
這篇文章主要為大家詳細(xì)介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對應(yīng)版本問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02

