统一异常处理
统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,
- 类上面加上 @ControllerAdvice 注解表示控制器通知类
- 方法上面加上 @ExceptionHandler 表示异常处理器,并添加异常返回的业务代码
两个结合表示当出现异常的时候执⾏某个通知,也就是执⾏某个⽅法事件,具体实现代码如下:
@ControllerAdvice // 表示针对 Controller 的通知类
public class MyExceptionAdvice {
// 依靠这个注解, 当出现异常时, 我们就能拿到这个异常
@ExceptionHandler(Exception.class) // 括号里面是要匹配的异常的类型,表示针对哪种异常的统一处理,如果出现的异常不匹配则拦截不到。
@ResponseBody // 表示返回的不是静态页面
public Object handler(Exception e) {
HashMap<String, Object> map = new HashMap<>();
map.put("state", -1);
map.put("data", null);
map.put("msg", e.getMessage());
return map;
}
}
⽅法名和返回值可以⾃定义,其中最重要的是 @ControllerAdvice 和 @ExceptionHandler(Exception.class) 注解。
@ControllerAdvice + @ResponseBody 可以等价替换为 @RestControllerAdvice
以上⽅法表示,如果出现了异常就返回给前端⼀个 HashMap 的对象。
我们可以针对不同的异常,返回不同的结果:
@RestControllerAdvice
public class MyExceptionAdvice {
@ExceptionHandler(Exception.class) // 能接收所有的异常
public Object exceptionAdvice(Exception e) {
HashMap<String, Object> result = new HashMap<>();
result.put("state", -1);
result.put("message", "总的异常信息:" + e.getMessage());
result.put("data", null);
return result;
}
@ExceptionHandler(NullPointerException.class) // 只能接收空指针异常
public Object nullPointerExceptionAdvice(NullPointerException e) {
HashMap<String, Object> result = new HashMap<>();
result.put("state", -1);
result.put("message", "空指针异常:" + e.getMessage());
result.put("data", null);
return result;
}
}
当有多个异常通知时,匹配顺序为当前类 -> 当前类的父类 -> 父类的父类。
比如上述代码出现空指针异常时,虽然上面两个都可以接收 NullPointerException 异常, 但是会优先匹配上 nullPointerExceptionAdvice 这个方法,而不是 exceptionAdvice。
注意:如果你把异常给 catch 的话,就拦截不到了,并且 catch 之后会影响事务的回滚,所以 Spring Boot 中 try catch 不是想加就加的。
好啦! 以上就是对 统一异常处理 的讲解,希望能帮到你 !
评论区欢迎指正 !