springboot统一异常处理

其他的理论基础就不介绍了,我们直接上代码高效处理:

1.定义异常返回码

可以根据自己需求自定义code和message

/**
 * @description: 统一返回码枚举
 * @Author yl
 * @Date 2024/3/13 16:15
 */
@Getter
@AllArgsConstructor
public enum ResultCodeEnum {

    ERROR_RESULT_CODE("9999","操作失败"),

    SUCCTESS_RESULT_CODE("0000","操作成功");

    private String code;
    private String message;
}

2.自定义异常类

/**
 * @description: 自定义异常类
 * @Author yl
 * @Date 2024/3/13 9:43
 */
@Data
public class BusinessException extends RuntimeException{

    public BusinessException(String message){
        super(message);
    }

    public BusinessException(String msg, Object... objs) {
        super(MessageFormatter.arrayFormat(msg, objs).getMessage());
    }
}

3.捕获异常,对异常进行统一处理类:

我们系统抛出的所有异常,希望能有一个地方统一捕获异常后,以前后端约定的格式返回给前端:

/**
 * @description: 统一异常处理类
 * @Author yl
 * @Date 2024/3/13 9:45
 */
@ControllerAdvice
public class BusinessExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(BusinessExceptionHandler.class);

    /**
     * 自定义业务异常
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = BusinessException.class)
    @ResponseBody
    public BaseResult<String> handleBusinessException(BusinessException e) {
        logger.error("自定义异常信息:{}",e.getMessage(), e);
        return BaseResult.errorResult(e.getMessage());
    }
    /**
     * 参数校验异常,将校验失败的所有异常组合成一条错误信息
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public BaseResult<String> handleValidException(MethodArgumentNotValidException e) {
        logger.error("参数绑定校验异常:{}", e.getMessage());
        List<FieldError> fieldError = e.getFieldErrors();
        StringBuilder sb = new StringBuilder();
        for (FieldError error : fieldError) {
            logger.info("error.getField:{}",error.getField());
            logger.info("defaultMessage:{}", error.getDefaultMessage());
            sb.append(error.getField()+error.getDefaultMessage()+",");
        }
        String result = sb.substring(0,sb.length()-1);
        logger.info("返回给前端的提示结果为:{}",result);
        return BaseResult.errorResult(result);
    }
    /**
     * 参数绑定异常
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = BindException.class)
    @ResponseBody
    public BaseResult<String> handleBindException(BindException e) {
        logger.error("参数绑定校验异常:{}", e.getMessage());

        return BaseResult.errorResult(e.getMessage());
    }
    /**
     * 参数异常
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = ConstraintViolationException.class)
    @ResponseBody
    public BaseResult<String> handleConstraintViolationException(ConstraintViolationException e) {
        Set<ConstraintViolation<?>> cons = e.getConstraintViolations();
        StringBuilder sb = new StringBuilder();
        for (ConstraintViolation<?> con : cons) {
            Path path = con.getPropertyPath();
        }
        logger.error("handleConstraintViolationException参数绑定校验异常:{}", e.getLocalizedMessage());
        return BaseResult.errorResult(e.getLocalizedMessage());
    }
    /**
     * 参数类型不匹配常
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = MethodArgumentTypeMismatchException.class)
    @ResponseBody
    public BaseResult<String> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) {
        logger.error("参数类型不匹配异常:{}", e.getParameter());

        return BaseResult.errorResult(e.getMessage());
    }
    /**
     * 其他异常异常
     *
     * @param e 异常
     * @return 异常结果
     */
    @ExceptionHandler(value = RuntimeException.class)
    @ResponseBody
    public BaseResult<String> handleRuntimeException(RuntimeException e) {
        logger.error("其他异常:{}", e);
        return BaseResult.errorResult(ResultCodeEnum.ERROR_RESULT_CODE);
    }
}

4.使用

直接抛出我们的自定义异常类:

相关推荐

  1. SpringBoot实现自定义异常+全局异常统一处理

    2024-03-16 05:24:04       36 阅读
  2. SpringBoot统一标准响应格式及异常处理

    2024-03-16 05:24:04       30 阅读
  3. SpringBoot 统一后端返回格式、处理全局异常

    2024-03-16 05:24:04       18 阅读
  4. dubbo 统一异常处理

    2024-03-16 05:24:04       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-16 05:24:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-16 05:24:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-16 05:24:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-16 05:24:04       18 阅读

热门阅读

  1. 【 React 】对React refs的理解?应用场景?

    2024-03-16 05:24:04       20 阅读
  2. hcie数通和云计算选哪个好?

    2024-03-16 05:24:04       19 阅读
  3. FPGA的应用方向

    2024-03-16 05:24:04       17 阅读
  4. 低代码大屏设计器使用入门级图文教程

    2024-03-16 05:24:04       19 阅读
  5. linux 的.bashrc .bash_profile .profile分别作用

    2024-03-16 05:24:04       17 阅读
  6. 为啥这么做实现不了优雅关闭服务,gin 项目

    2024-03-16 05:24:04       17 阅读
  7. 申请软著提交的演示视频有什么要求

    2024-03-16 05:24:04       21 阅读
  8. vue3 ref 和 reactive 区别

    2024-03-16 05:24:04       18 阅读
  9. Arcade官方教程解析8 Multiple Levels and Other Layers

    2024-03-16 05:24:04       18 阅读
  10. AJAX学习日记——Day 2

    2024-03-16 05:24:04       17 阅读