• 在Spring Boot项目中使用全局异常处理


    在完整的项目开发中,异常的出现几乎是无法避免的;如果凡是有可能出现异常的地方,我们都手动的使用try-catch将其捕获的话,虽然也能达到处理异常的效果,但是这样做会使得代码显得十分臃肿并且后期不好维护,也不利于多人系统开发。

    在Spring Boot中提供了统一处理异常的方法,SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用ExceptionHandler注解然后定义捕获异常的类型即可对这些捕获的异常进行统一的处理。接下来就用一个小demo来演示一下全局异常处理的方法。

    1. 创建自定义异常

    接着上一篇在Spring Boot项目中使用统一返回结果一文中,继续添加全局异常处理部分。
    在这里插入图片描述

    NotLoginException.java

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    public class NotLoginException extends RuntimeException{
    
        private Integer errorCode;
        private String message;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2.创建全局异常处理器

    定义全局异常处理器,用来捕获项目中抛出的自定义异常和普通异常,然后按照统一的数据格式返回给前端。在项目中不管是返回失败结果,还是返回成功结果,我们都统一返回数据的格式。

    MyExceptionHandler.java

    @ControllerAdvice
    public class MyExceptionHandler {
    
        /**
         * 捕获我们自定义的异常
         * @param notLoginException
         * @return
         */
        @ExceptionHandler(NotLoginException.class)
        @ResponseBody
        public Result notLoginExceptionHandler(NotLoginException notLoginException){
            return ResultGenerator.genErrorResult(notLoginException.getErrorCode(), notLoginException.getMessage());
        }
    
        /**
         * 捕获其他异常
         * @param exception
         * @return
         */
        @ExceptionHandler(Exception.class)
        @ResponseBody
        public Result otherException(Exception exception){
            return ResultGenerator.genErrorResult(Constants.RESULT_CODE_SERVER_ERROR, exception.getMessage());
        }
    
    
        // 可以定义区分更细粒度的异常,然后在此处进行捕获
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    3.创建测试控制器

    ExceptionController.java

    @Controller
    public class ExceptionController {
    
    
        @GetMapping("/notLoginException/{id}")
        @ResponseBody
        public Result notLoginException(@PathVariable("id") Integer id){
            if(id != null && id == 1){
                // 抛出一个自定义的异常
                throw new NotLoginException(Constants.RESULT_CODE_BAD_REQUEST, "没有登陆");  // 这里一般会定一个枚举,定义每一个状态码对应的信息
            }
            return ResultGenerator.genSuccessResult();
        }
    
    
        @GetMapping("/exception")
        @ResponseBody
        public Result exception(){
            int num = 1 / 0;
            return ResultGenerator.genSuccessResult();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    测试自定义异常,先正常给参数,接着给错误参数,让其抛出异常。
    在这里插入图片描述
    在这里插入图片描述
    测试其他异常。
    在这里插入图片描述
    在Spring Boot项目中全局异常处理的方法大致相同,只需要前期制定好需要处理那些异常,然后定义好枚举来映射异常信息,采用上述方法统一处理即可。

  • 相关阅读:
    【Linux】多线程互斥与同步
    指针变量和地址
    Spring IOC之ApplicationContextAware
    Mysql中如果建立了索引,索引所占的空间随着数据量增长而变大,这样无论写入还是查询,性能都会有所下降,怎么处理?
    django自带的序列化组件
    C++编程开发常用技能总结
    申请外观设计专利多少钱?
    【Kafka从成神到升仙系列 三】你真的了解 Kafka 的元数据嘛
    在银行外包如何自我提升
    03 - 调试环境的搭建(Bochs)(实验未完)
  • 原文地址:https://blog.csdn.net/pikcacho_pkq/article/details/127375757