SpringBoot异常处理器

本文讨论了在Java项目中的异常处理策略,包括全局捕获自定义异常、参数校验异常、参数绑定异常以及不同类型的异常处理器的使用。作者强调了良好异常设计的重要性,以减少开发过程中的工作量。
摘要由CSDN通过智能技术生成

前言:
两个同事
A同事:全局捕获后自定义,硬是不肯使用异常处理器
B同事:全局捕获后抛出固定内容,异常信息只打日志
虽然有些是人情世故,但这两种异常框架的用法让我十分难以苟同。
毕竟JAVA的异常框架很好用,好用到能把BUG抛到调用方,让调用方先过滤问题。

项目中良好的异常设计,能减少测试、调用、开发、联调的很多工作。

一、常用方式

新建exception包,配置异常处理器对象如下:

一个方法,代表对一类异常的捕获处理
ReturnResult 是通用响应封装

@Slf4j
@RestControllerAdvice
public class ExceptionHandlerConfig {

    /**
     * 自定义全局异常
     *
     * @param ex 自定义全局异常
     * @return 返回
     */
    @ExceptionHandler(BaseException.class)
    public ReturnResult handleBaseException(BaseException ex) {
        ReturnResult result = ReturnResult.error(ex);
        log.error("handle BaseException: {}", result);
        return result;
    }

    /**
     * 自定义 校验参数校验异常
     *
     * @param ex 异常
     * @return 参数校验异常
     */
    @ExceptionHandler(value = {ConstraintViolationException.class})
    @ResponseBody
    public ReturnResult handleConstraintViolationException(ConstraintViolationException ex) {
        ReturnResult result = ReturnResult.error(new ParamException(ex.getMessage()));
        log.error("handle ConstraintViolationException: {}", result);
        return result;
    }

    /**
     * 参数绑定异常
     *
     * @param ex 异常
     * @return 参数校验异常
     */
    @ExceptionHandler(value = {BindException.class})
    @ResponseBody
    public ReturnResult handleBindException(BindException ex) {
        List<ObjectError> allErrors = ex.getBindingResult().getAllErrors();
        List<String> msgList = new ArrayList<>();
        for (ObjectError allError : allErrors) {
            msgList.add(allError.getDefaultMessage());
        }
        ReturnResult result = ReturnResult.error(new ParamException(msgList + ""));
        log.error("handle BindException : {}", result);
        return result;
    }

    /**
     * 全局异常 非自定义异常,不允许正常显示
     *
     * @param ex 全局异常
     * @return 返回
     */
    @ExceptionHandler(Exception.class)
    public ReturnResult handleGlobeException(Exception ex) {
        log.error("error not catch", ex);
        ReturnResult result = new ReturnResult();
        result.setCode(ReturnCodeEnum.FAIL.getValue());
        result.setMsg(ReturnCodeEnum.FAIL.getMsg());
        return result;
    }

}

二、其它用法

  1. 缩小异常捕获范围(以包分割)
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*crzep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值