springboot专题系列十:springboot实现统一的异常处理

235 阅读2分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

==本文是基于Rest API的,返回的错误信息是json格式的数据!需要注意的是这个只是对发生异常的时候,统一了一下返回结果的格式,并不是对异常的try catch,控制台依旧会打印出异常日志==

完整项目地址: github.com/Dr-Water/sp…

1. springboot的默认异常处理方式,非常不美观:例如下面的:

在这里插入图片描述

2. 我们可以使用springMVC的@ControllerAdvice注解实现全局的异常处理,并统一异常的返回格式,步骤如下:

1. 创建统一的JSON返回对象,code:消息类型,message:消息内容,url:请求的url,data:请求返回的数据

@Data
public class ErrorInfo<T> {

    public static final Integer OK = 0;
    public static final Integer ERROR = 100;

    private Integer code;
    private String message;
    private String url;
    private T data;

}

2. 创建一个自定义异常,用来实验捕获该异常,并返回json

public class MyException extends Exception {

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

3. Controller中增加json映射,抛出MyException异常

@RestController
public class HelloController {

    /** 用于测试自定义异常
     * @return
     * @throws Exception
     */
    @RequestMapping("/json")
    public String json() throws Exception {
        throw new MyException("发生错误啦啦啦啦");
    }

    /** 用于测试除自定义异常以外的异常
     * @return
     */
    @RequestMapping("/json2")
    public Integer json2(){
        return 2/0;
    }
}

4. 定义异常处理器:

@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 最大的异常捕获类,用于最后兜底的异常的处理器
     * @param req
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, Exception e) throws Exception {
        ErrorInfo<String> r = new ErrorInfo<>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data");
        r.setUrl(req.getRequestURL().toString());
        return r;
    }

    /**
     * 用于捕获自己自定的异常,自定义的异常是处理器可以有多个,
     * 发生异常的时候如果匹配到的自定义的异常则不再匹配上面的最大的异常处理器(即:jsonErrorHandler)
     * @param req
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = MyException.class)
    @ResponseBody
    public ErrorInfo<String> myjsonErrorHandler(HttpServletRequest req, MyException e) throws Exception {
        ErrorInfo<String> r = new ErrorInfo<>();
        r.setMessage(e.getMessage());
        r.setCode(ErrorInfo.ERROR);
        r.setData("Some Data====myjsonErrorHandler");
        r.setUrl(req.getRequestURL().toString());
        return r;
    }
}

5. 测试

启动应用进行测试 访问:http://localhost:8080/json 可以得到如下的返回结果: 在这里插入图片描述 http://localhost:8080/json2 可以得到如下的返回结果: 在这里插入图片描述 第一个图由于是抛出的自定义的异常则返回的data信息里是自己在自定义异常处理器封装的数据即:==Some Data====myjsonErrorHandler== ,第二个图由于抛出的一个算术异常,默认被最大的exception拦截所以最后 data里的数据是:=="Some Data"==