Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 600|回复: 0

【springboot】全局异常处理

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-9-4 10:34:22 | 显示全部楼层 |阅读模式

    转自:

      https://blog.csdn.net/cp026la/article/details/86495196

    前言:

    开发中异常的处理必不可少,常用的就是 throw 和 try catch,这样一个项目到最后会出现很多冗余的代码,使用全局异常处理避免过多冗余代码。

    全局异常处理:

    1、pom 依赖(延续上一章代码):

    <dependencies>
        <!-- Spring Boot Web 依赖 -->
        <!-- Web 依赖 - 包含了 spring-boot-starter-validation 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Boot Test 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- spring-boot整合mybatis -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- alibaba的druid数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <!-- fastjson 依赖添加 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.31</version>
        </dependency>
    </dependencies>  


    2、公共的结果类封装:
    这里简单封装,实际根据自己业务需求去封装。

    @Getter
    @Setter
    public class ApiResult {
        // 响应业务状态
        private Integer status;
        // 响应消息
        private String msg;
        // 响应中的数据
        private Object data;
        public static ApiResult build(Integer status, String msg, Object data) {
            return new ApiResult(status, msg, data);
        }
        public static ApiResult ok(Object data) {
            return new ApiResult(data);
        }
        public static ApiResult ok() {
            return new ApiResult(null);
        }
        public ApiResult() { }
        public static ApiResult build(Integer status, String msg) {
            return new ApiResult(status, msg, null);
        }
        public ApiResult(Integer status, String msg, Object data) {
            this.status = status;
            this.msg = msg;
            this.data = data;
        }
        public ApiResult(Object data) {
            this.status = 200;
            this.msg = "OK";
            this.data = data;
        }
    }
    

      

    3、添加全局异常处理类(在入口函数下的包中新建):

    /**
     * 全局异常处理 Handler
     * @ControllerAdvice  配置控制器通知
     * annotations 属性: 指定我们需要拦截的注解,一个或多个(多个加到大括号中,逗号分隔)
     */
    // @RestControllerAdvice = @ResponseBody + @ControllerAdvice
    @RestControllerAdvice(annotations = {RestController.class})
    @Slf4j
    public class GlobalExceptionHandler {
       /**
        * 默认统一异常处理方法
        * @ExceptionHandler 注解用来配置需要拦截的异常类型, 也可以是自定义异常
        */
       @ExceptionHandler(Exception.class)
       // 此处可以指定返回的状态码 和 返回 结果说明
       // @ResponseStatus(reason = "exception",value = HttpStatus.BAD_REQUEST)
       public Object runtimeExceptionHandler(Exception e) {
           // 打印异常信息到控制台
           e.printStackTrace();
           log.error("请求出现异常,异常信息为: {}", e.getMessage());
           // 使用公共的结果类封装返回结果, 这里我指定状态码为 400
           return ApiResult.build(400, e.getMessage());
       }
    }  


    4、异常测试类:

    /**
     * 异常处理测试 controller
     */
    @RestController
    @Slf4j
    public class ExceptionController {
         @RequestMapping(value = "/exception/{number}")
         public ApiResult exception(@PathVariable int number) {
            int res = 10 / number;
            log.info(">>>>>结果number为: {}", res);
            return ApiResult.ok();
        }
    }  


    5、测试:
      5.1、请求接口:http://localhost:8080/exception/1 结果正常
      5.2、请求接口:http://localhost:8080/exception/0 出现除以 0 错误,全局异常处理起作用,返回指定结果集。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 13:33 , Processed in 0.055863 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表