springboot下添加全局異常處理和自定義異常處理的過程解析
前言
在spring項目中,優(yōu)雅處理異常,好處是可以將系統(tǒng)產(chǎn)生的全部異常統(tǒng)一捕獲處理,自定義的異常也由全局異常來捕獲,如果涉及到validator參數(shù)校驗器使用全局異常捕獲也是較為方便。
相關(guān)代碼:
GlobalExceptionHandler類:
@Slf4j @RestControllerAdvice public class GlobalExceptionHandler { /******************************** * @function : 自定義從捕捉 * @parameter : [e:CustomException | 自定義異常] * @date : 2023/12/5 11:47 ********************************/ @ExceptionHandler(value = CustomException.class) public AjaxResult customExceptionHandler(HttpServletRequest request, CustomException e) { log.error("業(yè)務(wù)異常,url:{}, 異常內(nèi)容:{}" ,request.getRequestURI(), e); return new AjaxResult(e.getCode() , e.getMessage(), null); } /******************************** * @function : 空指針異常捕捉 * @parameter : [e:Exception | 異常] * @date : 2023/12/5 11:47 ********************************/ @ExceptionHandler(value = Exception.class) public AjaxResult exceptionHandler(HttpServletRequest request, Exception e) { log.error("服務(wù)器內(nèi)部異常異常,url:{}, 異常內(nèi)容:{}" ,request.getRequestURI(), e); return new AjaxResult(500 , e.getMessage(), null); } }
自定義異常CustomException類:
@Slf4j @Data public class CustomException extends RuntimeException{ //錯誤碼 private int code; //錯誤信息 private String message; public CustomException() { super(); } public CustomException(ResultCodeEnum resultCodeEnum) { super(String.valueOf(resultCodeEnum.getCode())); this.code = resultCodeEnum.getCode(); this.message = resultCodeEnum.getMessage(); } }
通用返回類:AjaxResult
@Data public class AjaxResult extends HashMap<String, Object> { // 狀態(tài)碼 private static final String CODE_TAG = "code"; // 返回消息 private static final String MSG_TAG = "message"; // 數(shù)據(jù)對象 private static final String DATA_TAG = "data"; public AjaxResult(int code, String message, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, message); if (data != null) { super.put(DATA_TAG, data); } } /******************************** * @method : success * @function : 返回成功消息(重載) * @parameter : * @return : AjaxResult ********************************/ public static AjaxResult success(){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), null); } /******************************** * @method : success * @function : 返回成功消息(重載) * @parameter : message : String | 返回消息 * @return : AjaxResult ********************************/ public static AjaxResult success(String message){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, null); } /******************************** * @method : success * @function : 返回成功消息(重載) * @parameter : data : Object | 數(shù)據(jù)對象 * @return : AjaxResult ********************************/ public static AjaxResult success(Object data){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), ResultCodeEnum.SUCCESS.getMessage(), data); } /******************************** * @method : success * @function : 返回成功消息(重載) * @parameter : message : String | 返回消息 * @parameter : data : Object | 數(shù)據(jù)對象 * @return : AjaxResult ********************************/ public static AjaxResult success(String message, Object data){ return new AjaxResult(ResultCodeEnum.SUCCESS.getCode(), message, data); } /******************************** * @method : failed * @function : 返回失敗消息(重載) * @parameter : * @return : AjaxResult ********************************/ public static AjaxResult failed(){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), ResultCodeEnum.FAILED.getMessage(), null); } /******************************** * @method : failed * @function : 返回失敗消息(重載) * @parameter : message : String | 返回消息 * @return : AjaxResult ********************************/ public static AjaxResult failed(String message){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, null); } /******************************** * @method : failed * @function : 返回失敗消息(重載) * @parameter : resultCodeEnum : ResultCodeEnum | 失敗枚舉類型 * @return : AjaxResult ********************************/ public static AjaxResult failed(ResultCodeEnum resultCodeEnum){ return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), null); } /******************************** * @method : failed * @function : 返回失敗消息(重載) * @parameter : message : String | 返回消息 * @parameter : data : Object | 數(shù)據(jù)對象 * @return : AjaxResult ********************************/ public static AjaxResult failed(String message, Object data){ return new AjaxResult(ResultCodeEnum.FAILED.getCode(), message, data); } /******************************** * @method : failed * @function : 返回失敗消息(重載) * @parameter : resultCodeEnum : ResultCodeEnum | 失敗枚舉類型 * @parameter : data : Object | 數(shù)據(jù)對象 * @return : AjaxResult ********************************/ public static AjaxResult failed(ResultCodeEnum resultCodeEnum, Object data){ return new AjaxResult(resultCodeEnum.getCode(), resultCodeEnum.getMessage(), data); } }
枚舉類ResultCodeEnum:
public enum ResultCodeEnum { // 10??? 通用 SUCCESS(10000,"請求成功"), FAILED(10008, "請求失敗"), FAILED_PARAM_ERROR(10009, "參數(shù)錯誤"), ... private Integer code; private String message; ResultCodeEnum(Integer code, String message) { this.code = code; this.message = message; } public int getCode(){ return code; } public String getMessage(){ return message; } }
使用:
在controller里面判斷值是否異常,如果異常則直接拋出異常不進行執(zhí)行,終止當(dāng)前的流程,在service層也可以這樣處理。
public AjaxResult getUserInfo(@RequestParam(value = "userId") Integer userId) { if (userId == 0) { throw new CustomException(ResultCodeEnum.NOT_EXIST_USER_ERROR); } ... }
再者是一些數(shù)值上的錯誤,比如除0,這種情況會被全局異常捕獲,并返回相應(yīng)的錯誤給到前端
@GetMapping("/test") public AjaxResult test(){ int i = 60/0; return AjaxResult.success(); }
到此這篇關(guān)于springboot下添加全局異常處理和自定義異常處理的文章就介紹到這了,更多相關(guān)springboot異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Security 表單登錄功能的實現(xiàn)方法
這篇文章主要介紹了Spring Security 表單登錄,本文將構(gòu)建在之前簡單的 Spring MVC示例 之上,因為這是設(shè)置Web應(yīng)用程序和登錄機制的必不可少的。需要的朋友可以參考下2019-06-06java并發(fā)編程專題(十)----(JUC原子類)基本類型詳解
這篇文章主要介紹了java JUC原子類基本類型詳解的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07MyBatisPlus查詢報錯Unknow?column?‘id‘?in?‘field?list‘解決分析
這篇文章主要為大家介紹了MyBatisPlus查詢報錯Unknow?column?‘id‘?in?‘field?list‘解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Java中數(shù)組array和列表list相互轉(zhuǎn)換
這篇文章主要介紹了Java中數(shù)組array和列表list相互轉(zhuǎn)換,在Java中,可以將數(shù)組(array)和列表(list)相互轉(zhuǎn)換,但需要注意一些細節(jié)和限制,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-09-09