全局异常处理器
在项目中我们往往不能全面的捕获抛出的异常,这就使得异常最终会上抛至框架,框架底层就会返回一个封装着错误信息的JSON格式的数据,但这样的数据通常并不是我们想要的。
我们希望能够对上抛的异常实现统一处理,进而返回我们希望的错误信息,这时候就可以借助Spring中提供的全局异常处理器进行处理,并最终返回我们希望的错误信息。

快速入门
- 定义一个类,在类上添加@ControllerAdvice标明这是一个控制器通知类,并加上@ResponseBody标明这个类方法的返回值会转换为json后再响应给前端。
- 在控制器通知类中,需要定义一个方法来捕获异常,并在这个方法上添加@ExceptionHandler声明这是个异常处理方法,通过@ExceptionHandler注解中的value属性指定要捕获哪一类异常,当然也可以在方法形参中声明要捕获的异常类型。
java
//@RestControllerAdvice == @ControllerAdvice + @ResponseBody
@RestControllerAdvice//声明这是个通知器控制类
@Slf4j
public class GlobalExceptionAdvice {
@ExceptionHandler//声明这是个异常处理方法
public Result exceptionHandler(Exception e) {
//方法形参声明捕获异常类型,也可以在注解value属性中声明
log.error("[服务器异常] : {}" ,e.getMessage());
return Result.error("服务器异常,请稍后重试...");
}
@ExceptionHandler//声明这是个异常处理方法
public Result exceptionHandler(ArithmeticException e) {
//方法形参声明捕获异常类型,也可以在注解value属性中声明
log.error("[服务器异常] : {}" ,e.getMessage());
return Result.error("服务器出现算数异常,请稍后重试...");
}
}
当我们向上抛出不同异常并不catch时,异常最终会到达全局异常处理器,控制台结果如下:
- throw new RuntimeException("hello RuntimeException...")

- throw new ArithmeticException("hello ArithmeticException...")

当有多个异常处理方法时,抛出的异常匹配异常处理方法的顺序为当前异常自上一次匹配,如果当前异常没有对应异常处理方法,就会向上去找其父类的异常处理方法。