Spring 全局异常处理器

什么是全局异常处理器?

就是把错误异常统一处理的方法。

应用场景

1、如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异常处理器来捕捉该异常。

2、当你自定义了一个异常类,可以在全局异常处理器中来捕捉该异常。(当然也可以直接在抛出异常处直接捕获,但是这样需要在每一个抛出的地方都写一次捕获代码,看起来不够美观且复用性不强,其他异常同理)。

代码:

a.定义一个返回通用实体类

/**
 * @author : S JY
 * @description :
 * @date : 2019/10/15 10:15
 */
public class ResultDto<T> {
    private String msg;
    private Integer code;
    private T data;

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public ResultDto(String msg, Integer code, T data) {
        this.msg = msg;
        this.code = code;
        this.data = data;
    }
    public ResultDto() {
    }
}

b.自定义异常类 

/**
 * @author : S JY
 * @description :
 * @date : 2019/11/26 10:43
 */
public class MyException extends RuntimeException  {
    private String code;
    private String msg;
    private Object param;

    public MyException(String code, String msg, Object param) {
        this.code = code;
        this.msg = msg;
        this.param = param;
    }
    public MyException(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getParam() {
        return param;
    }

    public void setParam(Object param) {
        this.param = param;
    }
}

c.写一个全局异常处理器 

/**
 * @author : S JY
 * @description :
 * @date : 2019/11/26 10:47
 */
@Slf4j
@ControllerAdvice //该注解定义全局异常处理类
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class) //该注解声明异常处理方法
    @ResponseBody
    public Object handleException(HttpServletResponse response, Exception e) {
        log.error(e.getMessage(), e);
        if(e instanceof MyException) {
            MyException ex = (MyException)e;
            ResultDto<?> result = new ResultDto<>();
            result.setMsg(ex.getMsg());
            return result;
        }else{
            return new ResultDto<>("操作失败",null,null);
        }
    }
}

d.测试结果 

    @RequestMapping(value = "addUser")
    public ResultDto addUser(User user) {
        if (user.getName()==null){
            throw new MyException("用户不能为空");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值