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

引言

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

了解异常处理的基本概念

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

Spring Boot中的统一异常处理

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

创建全局统一异常处理类

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

java 复制代码
@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,"服务器端异常");
    }
}
创建自定义的异常类

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

java 复制代码
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;
    }

}
创建统一信息返回类
java 复制代码
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;
    }

}
创建一个枚举类型
java 复制代码
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
java 复制代码
@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中实现统一异常处理。通过定义自定义异常和创建全局异常处理器,我们能够更好地管理和处理应用中的各种异常情况。这不仅提高了代码的可读性和可维护性,还能够为用户提供更友好的错误信息。合理使用自定义异常,将有助于构建一个稳健的应用,为用户提供更加可靠的服务。

相关推荐
用户781366711445几秒前
对象存储(RGW)架构详解
后端
Python私教2 分钟前
软件开发报价为什么能差 3 倍:需求范围、验收标准和变更成本怎么算
后端·python·架构
苏三说技术3 分钟前
为什么越来越多人用gRPC?
后端
MacroZheng4 分钟前
程序员看文档神器,装上它,看Spring官方文档就一目了然了!
java·人工智能·后端
想风5 分钟前
Claude Code 实用技巧工作坊 —— Boris Cherny
前端·后端·github
长栎6 分钟前
Java 17 的模式匹配,正在杀死访问者模式
后端
骇客野人9 分钟前
SpringBoot 接入 Kafka 完整实操步骤
spring boot·kafka·linq
风曳丷11 分钟前
# 03|恶意文本如何一路摸到工具按钮
后端
2501_9159184112 分钟前
Rust 程序抓包解密,rustls 不认系统证书的几种办法
开发语言·后端·网络协议·ios·adb·https·rust
深漂的华哥13 分钟前
Ruoyi-Vue-Plus(V5.6.2) 开发环境搭建
java·前端·spring boot·后端·spring·ruoyi