• 手把手带你实现JAVA自定义异常和全局异常处理


    废话不多说,直接开搞

    准备工作

    1.安装Lombok插件,JDK1.8

    2.本文中使用的统一返回数据类引入的是阿里考拉

    1. com.alibaba.cola
    2. cola-component-domain-starter/version>

    枚举类

    自定义枚举类有两个属性,errorCode 错误码,errorValue 错误原因。在后面自定义异常中会使用到此枚举类。

    1. import lombok.AllArgsConstructor;
    2. import lombok.Getter;
    3. /**
    4. * 异常枚举类
    5. * @author zhouzhou
    6. */
    7. @Getter
    8. @AllArgsConstructor
    9. public enum ErrorEnum {
    10. /**
    11. * 用户信息相关
    12. */
    13. USER_NOT_EXIST_ERROR("20001","未查询到用户信息"),
    14. USER_NOT_LOGIN_ERROR("20002","用户登录信息有误,请重新登录"),
    15. ;
    16. private String errorCode;
    17. private String errorValue;
    18. }

    自定义异常基类

    自定义异常基类继承的也是RuntimeException,属于运行时异常,其中有两个成员变量,聪明的小伙伴是不是一眼就看出来这两个变量的含义了。

    1. import lombok.Data;
    2. /**
    3. * 业务类自定义异常类
    4. */
    5. @Data
    6. public class BusinessException extends RuntimeException{
    7. private String errorCode;
    8. private String errorValue;
    9. public BusinessException(String errorCode, String errorValue){
    10. super(errorValue);
    11. this.errorCode = errorCode;
    12. this.errorValue = errorValue;
    13. }
    14. }

    自定义业务异常

    继承BusinessException,主要是用来区分是哪部分业务抛出的异常,也可以将类名改为业务模块名,比如UserException,这样在异常信息补获的时候可以更清晰的知道是哪部分业务抛出的异常。

    1. import com.pailifan.meta.client.base.BusinessException;
    2. import com.pailifan.meta.client.enums.ErrorEnum;
    3. /**
    4. * 自定义异常
    5. * @author zhouzhou
    6. */
    7. public class CustomerException extends BusinessException {
    8. public CustomerException(ErrorEnum ErrorEnum){
    9. super(ErrorEnum.getErrorCode(), ErrorEnum.getErrorValue());
    10. }
    11. }

    ------------------重点来了-----------------

    全局异常处理器

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。参考:@ControllerAdvice 文档

    1. import com.alibaba.cola.dto.Response;
    2. import com.alibaba.cola.dto.SingleResponse;
    3. import com.alibaba.cola.exception.BizException;
    4. import com.pailifan.meta.client.base.BusinessException;
    5. import lombok.extern.slf4j.Slf4j;
    6. import org.springframework.http.HttpStatus;
    7. import org.springframework.web.bind.MethodArgumentNotValidException;
    8. import org.springframework.web.bind.annotation.ExceptionHandler;
    9. import org.springframework.web.bind.annotation.ResponseBody;
    10. import org.springframework.web.bind.annotation.RestControllerAdvice;
    11. /**
    12. * @Description
    13. * @Author zhouzhou
    14. **/
    15. @RestControllerAdvice
    16. @Slf4j
    17. public class GlobalExceptionHandler {
    18. /**
    19. * @description: 捕获异常信息
    20. * @param: [e]
    21. * @return: com.alibaba.cola.dto.Response
    22. * @author zhouzhou
    23. * @date: 2022/11/7 10:54
    24. */
    25. @ResponseBody
    26. @ExceptionHandler(BusinessException.class)
    27. public Response handleBizException(BusinessException e) {
    28. log.error("BusinessException,code={},value={}", e.getErrorCode(),e.getErrorValue());
    29. return SingleResponse.buildFailure(e.getErrorCode(), e.getErrorValue());
    30. }
    31. @ResponseBody
    32. @ExceptionHandler(Exception.class)
    33. public Response handleException(Exception e) {
    34. log.error("Exception", e);
    35. return SingleResponse.buildFailure(String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()), "系统异常");
    36. }
    37. }

    使用

    在业务代码使用中,如果校验条件不满足,可以直接使用throw抛出自定义异常信息,不用频繁的写try catch和手动拼接返回信息。

    1. if(判断条件){
    2. throw new CustomerException(ErrorEnum.USER_NOT_EXIST_ERROR);
    3.  }

    成果展示

    1. {
    2. "success": false,
    3. "errCode": "20002",
    4. "errMessage": "用户登录信息有误,请重新登陆",
    5. "data": null
    6. }

    http状态还是200,前端只需要根据success判断请求是否成功,如果失败可以直接弹框提示errMessage信息。成功状态下从data中获取数据

    全局异常处理和自定义异常的意义

    在开发过程中,后端接口返回的数据结构应该是统一且固定的,不应该因为后端发生异常而导致向前端返回的数据结构发生变化,这样就减少了前段的校验工作,只需要一套公共代码就能解析固定的数据结构。

    而自定义异常是为了在发生错误时,可以从错误信息中更好更快的找到有用的提示信息。也可以通过异常信息快速的定位业务模块。

  • 相关阅读:
    es分布式架构和原理分析
    phpinfo为关键的getshell方法
    软件测评中心测试项目及测试过程简析,CMA、CNAS软件测试报告获取
    中秋佳节 月饼来访 ! python采集相关数据,看看哪款月饼最受欢迎
    SAP ABAP OData 服务如何支持修改(Update)操作试读版
    这可是全网eNSP安装最完整,最详细的图解,没有之一(常见问题)
    Failed to process, please exclude the tableName or statementId.
    线程池在业务中的实践
    安全测试BurpSuite-抓包篡改数据
    算法训练 第三周
  • 原文地址:https://blog.csdn.net/qq_29082603/article/details/127728396