springboot捕獲全局異常實(shí)現(xiàn)過程
學(xué)習(xí)目標(biāo)
java中的異常和錯(cuò)誤
學(xué)習(xí)內(nèi)容
- 首頁要了解什么是異常什么是錯(cuò)誤
- 捕捉全局異常
- 自定義異常
java中異常和錯(cuò)誤的區(qū)別
Error類和Exception類的父類都是throwable類: 他們的區(qū)別是:
- Error類一般是指與虛擬機(jī)相關(guān)的問題,如系統(tǒng)崩潰,虛擬機(jī)錯(cuò)誤,內(nèi)存空間不足,方法調(diào)用棧溢等。對(duì)于這類錯(cuò)誤的導(dǎo)致的應(yīng)用程序中斷,僅靠程序本身無法恢復(fù)和和預(yù)防,遇到這樣的錯(cuò)誤,建議讓程序終止。
- Exception類表示程序可以處理的異常,可以捕獲且可能恢復(fù)。遇到這類異常,應(yīng)該盡可能處理異常,使程序恢復(fù)運(yùn)行,而不應(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ù)異常,如果直接讓用戶看見異常信息不友好

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

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

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

控制臺(tái)也輸出異常信息

到這異常的捕獲就完成了,但是我們捕獲都是系統(tǒng)自帶的異常,我就在想能不能自定義異常,然后進(jìn)行捕獲,開干
實(shí)現(xiàn)步驟:
- 創(chuàng)建一個(gè)枚舉進(jìn)行異常傳遞
- 創(chuàng)建一個(gè)自定義的異常類取名叫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ù)校驗(yàn)錯(cuò)誤"),
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é)果

控制臺(tái):

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java實(shí)現(xiàn)的n*n矩陣求值及求逆矩陣算法示例
這篇文章主要介紹了java實(shí)現(xiàn)的n*n矩陣求值及求逆矩陣算法,結(jié)合具體實(shí)例形式分析了java基于數(shù)組的矩陣定義、遍歷、運(yùn)算等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Java如何獲取一個(gè)IP段內(nèi)的所有IP地址
這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)起始和結(jié)束的IP地址獲取IP段內(nèi)所有IP地址,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
Java出現(xiàn):JWT strings must contain exactly&
這篇文章主要介紹了JWT令牌解析失敗的原因和解決方法,包括Header、Payload和Signature三段式結(jié)構(gòu),常見錯(cuò)誤原因,通用解決方案以及額外注意點(diǎn),需要的朋友可以參考下2026-01-01
Spring使用 AsyncConfigurer 自定義線程池實(shí)現(xiàn)高效異步任務(wù)管理
Spring框架的@Async注解雖然提供了異步任務(wù)支持,但默認(rèn)線程池不適合生產(chǎn)環(huán)境,通過自定義線程池配置類實(shí)現(xiàn)AsyncConfigurer接口,可以統(tǒng)一管理線程池參數(shù),解決企業(yè)級(jí)應(yīng)用中線程爆炸、拒絕策略和可觀測性等問題,下面就來介紹一下如何實(shí)現(xiàn)2026-02-02
SpringBoot如何指定某些類優(yōu)先啟動(dòng)
這篇文章主要介紹了SpringBoot如何指定某些類優(yōu)先啟動(dòng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Eclipse安裝Aptana插件(注意對(duì)應(yīng)版本問題)
這篇文章主要為大家詳細(xì)介紹了Eclipse安裝Aptana插件的相關(guān)資料,特別注意對(duì)應(yīng)版本問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
java在cmd運(yùn)行"-d"和"-cp"參數(shù)解讀
這篇文章主要介紹了java在cmd運(yùn)行"-d"和"-cp"參數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

