• SpringBoot实现全局异常处理


    1.全局异常处理介绍

    1.1 简介

    全局异常处理器即把错误异常统一处理的方法,可以在多个地方使用,而不需要为每个地方编写单独的处理逻辑。它可以帮助开发人员更好地管理异常,并提供一致的错误处理方式。

    1.2 优点

    1.全局异常处理可以提高代码的重用性和可维护性

    2.避免重复编写异常处理代码,减少出错的可能性,提高程序的稳定性。

    3.配置简单,将代码复制到项目中就可以使用

    2.全局异常处理的实现方式

    自己定义一个类,在类上添加**@ControllerAdvice** 注解,在方法上添加**@ExceptionHandler**注解,就完成了一个全局异常处理的搭建,在一个类中可以写多个ExceptionHandler,对于不同类型的ExceptionHandler可以拦截不同类型的exception,然后再最后面设置一个拦截Exception.class的拦截器,用于拦截掉所有的方法,如果全局拦截中有我们不想拦截的异常类,只需要捕获以后再从新抛出即可示。

    • @ControllerAdvice设定拦截规则
    • @ExceptionHandler设定拦截的异常类型

    3.全局异常处理代码实现

    3.1 定义一个统一返回类

    @Getter
    @Setter
    @AllArgsConstructor
    public class Results {
        // 返回状态标识
        private Integer code;
        // 返回数据
        private Object data;
        // 返回成功或失败的消息
        private String msg;
    
        // 成功返回:数据
        public static Results success(Object data) {
            return success(200, data, "");
        }
    
        // 成功返回:数据、消息
        public static Results success(Object data, String msg) {
            return success(200, data, msg);
        }
    
        // 成功返回:自定义状态码、数据、消息
        public static Results success(Integer code, Object data, String msg) {
            return new Results(code, data, msg);
        }
    
        // 失败只返回:消息
        public static Results fail(String msg) {
            return fail(-1, null, msg);
        }
    
        // 失败返回:数据、消息
        public static Results fail(Object data, String msg) {
            return fail(-1, data, msg);
        }
    
        // 失败返回:自定义状态码、数据、消息
        public static Results fail(Integer code, Object data, String msg) {
            return new Results(code, data, msg);
        }
    }
    
    • 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
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    3.2 定义全局异常处理

    @ControllerAdvice(annotations = {RestController.class, Controller.class})
    @ResponseBody
    @Slf4j
    public class GlobalExceptionHandler {
        @ExceptionHandler(value = ArithmeticException.class)
        public Results exceptionHandler(ArithmeticException exception){
            String ExMsg = exception.getMessage();
            log.error(ExMsg);
            if (ExMsg.contains("zero")){
                return Results.fail(ExMsg);
            }
            return Results.fail("未知异常!");
        }
    
        @ExceptionHandler(Exception.class)
        public Results exceptionHandler1(Exception exception){
    
            return Results.fail("处理所有异常!发生的错误是:"+exception.getMessage());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    3.3 制造异常

    @Controller
    public class BasicController {
    
        // http://127.0.0.1:8080/hello?name=lisi
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(@RequestParam(name = "name", defaultValue = "unknown user") String name) {
            int m = 10;
            m = m/0;
            return "Hello " + name;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    访问网址:http://127.0.0.1:8080/hello?name=lisi

    页面结果显示:

    image-20230928152206691

    4.源代码码云地址

    全局异常处理仓库地址

    更多内容请查看码云仓库
    image-20230928102756448

  • 相关阅读:
    C语言学习:11、数组
    IDA反汇编之栈帧例释
    19. Remove Nth Node From End of List
    R语言使用epiDisplay包的pyramid函数可视化金字塔图、基于已有的汇总数据(表格数据)可视化金字塔图、使用main参数添加自定义标题信息
    Linux信号量:POSIX标准接口、实现生产者与消费者模型
    91、Redis - 事务 与 订阅-发布 相关的命令 及 演示
    贯穿设计模式第二话--开闭原则
    【API篇】十、生成Flink水位线
    Python之property装饰器,上下文管理器与生成器
    CDH6.3.2 的pyspark读取excel表格数据写入hive中的问题汇总
  • 原文地址:https://blog.csdn.net/qq_52699757/article/details/133384827