【Spring AOP】统一异常处理

统一异常处理

统⼀异常处理使⽤的是 @ControllerAdvice + @ExceptionHandler 来实现的,

  1. 类上面加上 @ControllerAdvice 注解表示控制器通知类
  2. 方法上面加上 @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。

【Spring AOP】统一异常处理_第1张图片

注意:如果你把异常给 catch 的话,就拦截不到了,并且 catch 之后会影响事务的回滚,所以 Spring Boot 中 try catch 不是想加就加的。

好啦! 以上就是对 统一异常处理 的讲解,希望能帮到你 !
评论区欢迎指正 !

你可能感兴趣的:(Spring,spring,java,后端)