Java Springboot全局異常處理
前言
對于作為菜鳥程序員的我來說,經(jīng)常在controller使用try-catch 來包裹住我的service層代碼,首頁,他及其的不好看,其次,每個方法都有這種代碼塊,思考有沒有辦法去掉它,并且優(yōu)雅的處理異常。這就是今天要說的全局異常捕獲
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、思路?
springboot提供了全局異常處理的注解,我們需要弄明白的是。撲捉什么異常,結果如果返回,如何優(yōu)雅的管理返回的結果集。
二、步驟
1.自定義接口:
自定義接口主要是描述返回的code碼和返回msg,自定義錯誤描述枚舉需要實現(xiàn)這個接口
public interface ErrorType {
/**
* 返回code
*
* @return
*/
String getCode();
/**
* 返回mesg
*
* @return
*/
String getMesg();
}
2.自定義錯誤枚舉
使用枚舉,看起來代碼很優(yōu)雅,并且不用使用static final來定義類型。
@Getter
public enum SystemErrorType implements ErrorType {
SYSTEM_ERROR("-1", "系統(tǒng)異常"),
SYSTEM_BUSY("000001", "系統(tǒng)繁忙,請稍候再試");
/**
* 錯誤類型碼
*/
private String code;
/**
* 錯誤類型描述信息
*/
private String mesg;
SystemErrorType(String code, String mesg) {
this.code = code;
this.mesg = mesg;
}
}
3.自定義異常類
@Getter
public class MyException extends RuntimeException{
/**
* 異常對應的錯誤類型
*/
private final ErrorType errorType;
/**
* 默認是系統(tǒng)異常
*/
public MyException () {
this.errorType = SystemErrorType.SYSTEM_ERROR;
}
public MyException(SystemErrorType systemErrorType) {
this.errorType = systemErrorType;
}
4.異常捕獲
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandlerAdvice extends DefaultGlobalExceptionHandlerAdvice {
@ExceptionHandler(value = {MyException .class})
public Result MyException (MyException ex) {
log.error(ex.getMessage());
return Result.fail(ex.getErrorType());
}
@ExceptionHandler(value = {NotRoleException.class})
public Result NotRoleException(NotRoleException nle) {
// 打印堆棧,以供調(diào)試
//nle.printStackTrace();
String message = "該功能僅供"+nle.getRole()+"使用!";
// 返回給前端
return Result.fail("090017",message,null);
}
}
也不是說只能通過枚舉來返回,只要你的返回工具類支持參數(shù)填寫,可以做類似于第二種的返回,但是這樣方法對于返回的code來太好管理
5.在代碼中拋異常
比如我做判空處理時,利用枚舉作為參數(shù)返回
@PostMapping("/listQuestionVO")
public Result listQuestionBankVO(@RequestBody QuestionBankQuery query){
if (query.getPageNum()==null || query.getPageSize()==null){
return Result.fail(QuestionnaireErrorType.PARAMETERISNULL_ERROR);
}
Result result = questionBankService.listQuestionBankVO(query);
return result;
}
實際上,你可以在你需要處理異常的地方直接throws異常,可以直接在方法上throws拋出,等待全局異常捕獲
總結
只要管理code到位,用返回類型的工具類來替換枚舉更適合小白
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內(nèi)容!
相關文章
Java為什么基本數(shù)據(jù)類型不需要進行創(chuàng)建對象?
今天小編就為大家分享一篇關于Java為什么基本數(shù)據(jù)類型不需要進行創(chuàng)建對象?,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
java Beanutils.copyProperties( )用法詳解
這篇文章主要介紹了java Beanutils.copyProperties( )用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05
Java concurrency之集合_動力節(jié)點Java學院整理
Java集合主體內(nèi)容包括Collection集合和Map類;而Collection集合又可以劃分為List(隊列)和Set(集合),有需要的小伙伴可以參考下2017-06-06
Java序列化JSON丟失精度問題的解決方法(修復Long類型太長)
這篇文章主要給大家介紹了關于Java序列化JSON丟失精度問題的解決方法,修復Long類型太長的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2022-03-03
spring boot啟動加載數(shù)據(jù)原理分析
實際應用中,我們會有在項目服務啟動的時候就去加載一些數(shù)據(jù)或做一些事情這樣的需求。這時spring Boot 為我們提供了一個方法,通過實現(xiàn)接口 CommandLineRunner 來實現(xiàn)。下面給大家詳細介紹下,需要的的朋友參考下吧2017-04-04

