Spring Boot使用@ControllerAdvice统一异常处理

返回统一的JSON数据格式文章中介绍了Spring Boot后端开发如何返回统一的JSON数据格式。为了让系统产生的异常结果也显示为统一的JSON数据格式,并且统一处理系统的异常信息,那么需要统一异常处理。

一、统一异常处理、特定异常处理

1. 创建统一异常处理器

创建一个package,名称为exceptionHandler(异常处理器),在包内创建全局异常处理器GlobalExceptionHandler.java
统一返回的JSON数据格式 R 如下:

{
  "success": 布尔, //响应是否成功
  "code": 数字, //响应码
  "message": 字符串, //返回消息
  "data": HashMap //返回数据,放在键值对中
}

R是统一返回的JSON数据类,详细细节参考文章关于返回统一数据格式

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class) //异常处理器 处理全部的异常
    @ResponseBody //用来返回JSON数据的注解
    public R error(Exception e){
        e.printStackTrace();
        return R.error().message("执行了全局异常处理");//返回统一JSON数据R,并在R的message中写入“执行了全局异常处理”
    }

    // 特定异常
    @ResponseBody //用来返回JSON数据的注解
    @ExceptionHandler(ArithmeticException.class)  // 异常处理器 处理特定的ArithmeticException异常
    public R error(ArithmeticException e){
        e.printStackTrace();
        return R.error().message("执行了ArithmeticException异常处理");
        //返回统一JSON数据R,并在R的message中写入“执行了ArithmeticException异常处理”
    }
    //自定义异常
    @ResponseBody
    @ExceptionHandler(CustomizeException.class)
    public R error(CustomizeException e){
        log.error(e.getMessage());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }
}

2. 自定义异常CustomizeException的定义

在包exceptionHandler(异常处理器)内创建自定义异常类,继承RuntimeException。

@Data
@AllArgsConstructor  // 生成有参构造方法
@NoArgsConstructor  // 生成无参数构造
public class CustomizeException extends RuntimeException{
    private Integer code; // 状态码
    private String msg; //异常信息
}

2.1 在异常处理器中添加对自定义异常的处理方法

GlobalExceptionHandler.java中添加如下代码:

//自定义异常
    @ResponseBody
    @ExceptionHandler(CustomizeException.class)
    public R error(CustomizeException e){
        log.error(e.getMessage());
        e.printStackTrace();
        return R.error().code(e.getCode()).message(e.getMsg());
    }

2.2 业务中需要的位置抛出自定义异常CustomizeException

try {
    int a = 10/0;
}catch(Exception e) {
    throw new CustomizeException(20001,"出现自定义异常");
}
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页