springboot实现统一的异常处理

本文介绍如何在SpringBoot项目中实现全局异常处理,通过自定义异常和使用@ControllerAdvice注解,统一异常返回格式为JSON,提升错误信息的可读性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文是基于Rest API的,返回的错误信息是json格式的数据!需要注意的是这个只是对发生异常的时候,统一了一下返回结果的格式,并不是对异常的try catch,控制台依旧会打印出异常日志
完整项目地址:
https://github.com/Dr-Water/springboot-action/tree/master/springboot-global-exception

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 DatamyjsonErrorHandler ,第二个图由于抛出的一个算术异常,默认被最大的exception拦截所以最后 data里的数据是:“Some Data”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

T-OPEN

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

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

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

打赏作者

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

抵扣说明:

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

余额充值