手把手带你实现JAVA自定义异常和全局异常处理
廢話不多說,直接開搞
準備工作
1.安裝Lombok插件,JDK1.8
2.本文中使用的統一返回數據類引入的是阿里考拉
<dependency><groupId>com.alibaba.cola</groupId><artifactId>cola-component-domain-starter</artifactId>/version> </dependency>枚舉類
自定義枚舉類有兩個屬性,errorCode 錯誤碼,errorValue 錯誤原因。在后面自定義異常中會使用到此枚舉類。
import lombok.AllArgsConstructor; import lombok.Getter;/*** 異常枚舉類* @author zhouzhou*/ @Getter @AllArgsConstructor public enum ErrorEnum {/*** 用戶信息相關*/USER_NOT_EXIST_ERROR("20001","未查詢到用戶信息"),USER_NOT_LOGIN_ERROR("20002","用戶登錄信息有誤,請重新登錄"),;private String errorCode;private String errorValue; }自定義異常基類
自定義異常基類繼承的也是RuntimeException,屬于運行時異常,其中有兩個成員變量,聰明的小伙伴是不是一眼就看出來這兩個變量的含義了。
import lombok.Data; /*** 業務類自定義異常類*/ @Data public class BusinessException extends RuntimeException{private String errorCode;private String errorValue;public BusinessException(String errorCode, String errorValue){super(errorValue);this.errorCode = errorCode;this.errorValue = errorValue;}}自定義業務異常
繼承BusinessException,主要是用來區分是哪部分業務拋出的異常,也可以將類名改為業務模塊名,比如UserException,這樣在異常信息補獲的時候可以更清晰的知道是哪部分業務拋出的異常。
import com.pailifan.meta.client.base.BusinessException; import com.pailifan.meta.client.enums.ErrorEnum;/*** 自定義異常* @author zhouzhou*/ public class CustomerException extends BusinessException {public CustomerException(ErrorEnum ErrorEnum){super(ErrorEnum.getErrorCode(), ErrorEnum.getErrorValue());} }------------------重點來了-----------------
全局異常處理器
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定義@ExceptionHandler、@InitBinder、@ModelAttribute,并應用到所有@RequestMapping中。參考:@ControllerAdvice 文檔
import com.alibaba.cola.dto.Response; import com.alibaba.cola.dto.SingleResponse; import com.alibaba.cola.exception.BizException; import com.pailifan.meta.client.base.BusinessException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @Description* @Author zhouzhou**/ @RestControllerAdvice @Slf4j public class GlobalExceptionHandler {/** * @description: 捕獲異常信息 * @param: [e] * @return: com.alibaba.cola.dto.Response * @author zhouzhou* @date: 2022/11/7 10:54*/@ResponseBody@ExceptionHandler(BusinessException.class)public Response handleBizException(BusinessException e) {log.error("BusinessException,code={},value={}", e.getErrorCode(),e.getErrorValue());return SingleResponse.buildFailure(e.getErrorCode(), e.getErrorValue());}@ResponseBody@ExceptionHandler(Exception.class)public Response handleException(Exception e) {log.error("Exception", e);return SingleResponse.buildFailure(String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()), "系統異常");} }使用
在業務代碼使用中,如果校驗條件不滿足,可以直接使用throw拋出自定義異常信息,不用頻繁的寫try catch和手動拼接返回信息。
if(判斷條件){throw new CustomerException(ErrorEnum.USER_NOT_EXIST_ERROR);}成果展示
{"success": false,"errCode": "20002","errMessage": "用戶登錄信息有誤,請重新登陸","data": null }http狀態還是200,前端只需要根據success判斷請求是否成功,如果失敗可以直接彈框提示errMessage信息。成功狀態下從data中獲取數據
全局異常處理和自定義異常的意義
在開發過程中,后端接口返回的數據結構應該是統一且固定的,不應該因為后端發生異常而導致向前端返回的數據結構發生變化,這樣就減少了前段的校驗工作,只需要一套公共代碼就能解析固定的數據結構。
而自定義異常是為了在發生錯誤時,可以從錯誤信息中更好更快的找到有用的提示信息。也可以通過異常信息快速的定位業務模塊。
總結
以上是生活随笔為你收集整理的手把手带你实现JAVA自定义异常和全局异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MT【103】二阶递推找规律
- 下一篇: 专业课的计算机培训,计算机专业课培训.p