• 【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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ⽅法名和返回值可以⾃定义,其中最重要的是 @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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    当有多个异常通知时,匹配顺序为当前类 -> 当前类的父类 -> 父类的父类。

    比如上述代码出现空指针异常时,虽然上面两个都可以接收 NullPointerException 异常, 但是会优先匹配上 nullPointerExceptionAdvice 这个方法,而不是 exceptionAdvice。

    在这里插入图片描述

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

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

  • 相关阅读:
    python基础知识(二):变量和常用数据类型
    硬件-可靠性-热测试
    oracle学习64-oracle之数据处理之其他数据库对象
    【笔记】大话设计模式14-观察者模式
    AnyTransition/过渡动画, MatchedGeometryEffect/匹配几何动画效果 的使用
    [centos]centos7源码编译cmake报错Could NOT find OpenSSL
    【Java面试】为什么重写equals方法必须同时重写HashCode方法?
    MQTT云台如何助力分布式农村污水处理的远程管理
    基于STM32的智能健康监测手环
    SAP 电商云 Spartacus UI Angular UI 和 Accelerator JSP UI 的混合使用
  • 原文地址:https://blog.csdn.net/m0_61832361/article/details/133790991