Spring Boot实现统一异常处理的技术解析

本文详细介绍了如何在SpringBoot中使用全局异常处理器进行统一异常处理,包括创建自定义异常类、全局异常处理类以及其在提高代码可维护性和系统稳定性方面的优势。
摘要由CSDN通过智能技术生成

引言

在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统一异常处理。

了解异常处理的基本概念

在Java中,异常是程序运行过程中出现的问题,可以分为两大类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。受检异常需要程序员显式地进行处理,而非受检异常则不需要。为了提高代码的可读性和可维护性,我们通常会对异常进行统一的处理。

Spring Boot中的统一异常处理

Spring Boot提供了一个全局的异常处理器(GlobalExceptionHandler),可以捕获所有的异常,并进行统一的处理。要实现统一异常处理。

创建全局统一异常处理类

创建一个自定义的异常处理类,实现ControllerAdvice@RestControllerAdvice注解。这个类将会成为全局的异常处理器。

@ControllerAdvice(basePackages="com.example.controller")
public class GlobalExceptionHandler {
    @ExceptionHandler(value = {Exception.class})
    @ResponseBody
    public <T> Resp<T> exceptionHandler(Exception e){
        //这里先判断拦截到的Exception是不是我们自定义的异常类型
        if(e instanceof CustomException){
            CustomException customException = (CustomException)e;
            return Resp.error(customException.getCode(),customException.getMsg());
        }

        //如果拦截的异常不是我们自定义的异常(例如:数据库主键冲突)
        return Resp.error(500,"服务器端异常");
    }
}
创建自定义的异常类

首先,我们需要定义一些自定义的异常类,以便更好地区分各种异常情况。例如:

public class CustomException extends RuntimeException {

    private int code = 500;
    private String msg = "服务器异常";


    public CustomException(CustomExceptionCodeMsg customExceptionCodeMsg) {
        super();
        this.code = customExceptionCodeMsg.getCode();
        this.msg = customExceptionCodeMsg.getMsg();

    }

    public CustomException(int code, String msg) {
        super();
        this.code = code;
        this.msg = msg;

    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

}
创建统一信息返回类
public class Resp<T> {

    //服务端返回的错误码
    private int code = 200;
    //服务端返回的错误信息
    private String msg = "success";
    //我们服务端返回的数据
    private T data;

    private Resp(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public static <T> Resp success(T data) {
        Resp resp = new Resp(200, "success", data);
        return resp;
    }

    public static <T> Resp success(String msg, T data) {
        Resp resp = new Resp(200, msg, data);
        return resp;
    }

    public static <T> Resp error(CustomExceptionCodeMsg customExceptionCodeMsg) {
        Resp resp = new Resp(customExceptionCodeMsg.getCode(), customExceptionCodeMsg.getMsg(), null);
        return resp;
    }

    public static <T> Resp error(int code, String msg) {
        Resp resp = new Resp(code, msg, null);
        return resp;
    }

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public T getData() {
        return data;
    }

}
创建一个枚举类型
public enum CustomExceptionCodeMsg {
    INVALID_CODE(0000, "验证码无效"),
    USERNAME_NOT_EXISTS(11111, "用户名不存在");

    private int code;
    private String msg;

    public int getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }


    CustomExceptionCodeMsg(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

}
创建一个controller
@RestController
public class ExceptionController {
    @GetMapping("/exception")
    public Resp<String> exception(String name) {

        if ("ok".equals(name)) {
            return Resp.success("成功");
        }
        if ("err".equals(name)) {
            //抛业务相关的异常
            throw new CustomException(CustomExceptionCodeMsg.USERNAME_NOT_EXISTS);
        }

        if ("errcode".equals(name)) {
            throw new CustomException(CustomExceptionCodeMsg.INVALID_CODE);
        }
        if ("0".equals(name)) {
            int i = 1 / 0;
        }

        return Resp.success(name);
    }

    @GetMapping("/list")
    public Resp<List> list() {
        List<String> list = Arrays.asList("CSDN", "奇遇少年");

        return Resp.success(list);
    }
}

运行测试:

使用全局异常处理器的优势:

(1)提高代码的可读性和可维护性。通过将异常处理逻辑集中在一个地方,可以降低代码的复杂度,提高代码的可读性。同时,当需要修改异常处理逻辑时,只需要修改一个地方即可。

(2)提高系统的稳定性。通过全局的异常处理器,我们可以更好地定位和处理异常,避免因为未处理的异常导致系统崩溃。

(3)方便进行日志记录和监控。全局的异常处理器可以方便地记录异常信息,便于开发人员进行调试和排查问题。同时,也可以方便地将异常信息发送到监控系统,进行实时的监控和报警。

结语

通过本文的介绍,你已经学会了如何在Spring Boot中实现统一异常处理。通过定义自定义异常和创建全局异常处理器,我们能够更好地管理和处理应用中的各种异常情况。这不仅提高了代码的可读性和可维护性,还能够为用户提供更友好的错误信息。合理使用自定义异常,将有助于构建一个稳健的应用,为用户提供更加可靠的服务。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
项目详细功能参考项目演示内容即可项目优势:1、项目从零开始到完结 附带视频,源码以及相关辅助资料,适合学习使用,项目也可拿来即用。2、几乎全手写代码,功能流程详细 跟着可以独立完成,附带详细代码相关常见bug 和 调试解决方案,让大家学会跟踪快速解决问题。3、系统后端使用LayUI技术,对页面不精通的小伙伴也可以快速完成精美页面的设计及应用,支持统一后台管理,也可拿来做其他项目通用后台4、针对layui 相关技术点薄弱的学员提供相关技术点学习,让快速上手完成项目研发5、选材来自生活,项目真实感强,可用学习使用和就业面试使用,适合作为面试中提高实际项目经验...6、该项目前后端分离,满足前沿技术点..项目技术栈:- 数据库:MySQL8.0- 后端技术SpringBoot,MyBatisPlus,JWT 等- 日志技术:Log4j- 数据库连接池:druid- 前端技术:LayUI, axios,Echarts,Ztree 等- Web容:Apache Tomcat 9- 项目管理工具:Maven3.6- 思维导图设计工具:XMIND 8- 开发工具: IDEA2020, WebStorm2020- 数据库设计软件:Power Designer16.5特别提示:1、涉及相关技术点学习,更多侧重大学生或无项目经验以及项目经验较少的学员入门到项目完结项目实战2、项目中功能处理大多提供多种解决方式,如跨域访问,更多让大家了解解决方式的同时学会技术点应用3、加入bug的调试以及代码跟踪处理,更好的让学员更多学会如何解决问题
好的,很高兴能回答您的问题。 首先,让我们了解一下 @ControllerAdvice 注解。它是 Spring MVC 框架提供的一种全局异常处理机制,可以让我们在一个地方集中处理所有 Controller 抛出的异常。 使用 @ControllerAdvice 注解的类可以包含多个 @ExceptionHandler 注解的方法,每个方法处理不同的异常类型。当 Controller 抛出异常时,Spring 会根据异常类型找到对应的 @ExceptionHandler 方法进行处理。 以下是一个简单的 @ControllerAdvice 示例: ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Something went wrong!"); } @ExceptionHandler(MyCustomException.class) public ResponseEntity<String> handleMyCustomException(MyCustomException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); } } ``` 在上面的例子中,我们定义了两个 @ExceptionHandler 方法,分别处理 Exception 和 MyCustomException 类型的异常。 如果您想要更细粒度地处理异常,可以在 @ExceptionHandler 注解中指定具体的异常类型,如下所示: ```java @ExceptionHandler({IOException.class, SQLException.class}) public void handleIOExceptionOrSQLException() { // ... } ``` 另外,@ControllerAdvice 还支持自定义返回值类型和异常解析,具体可以参考 Spring 官方文档。 最后,关于统一处理异常,除了使用 @ControllerAdvice,我们还可以使用 Spring Boot 提供的 ErrorController 接口或实现自己的异常处理。 希望能对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇遇少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值