SpringBoot的全局异常像诗一样优雅

前言

在Spring Boot应用中,全局异常的处理是一个非常重要的方面,它可以提高系统的稳定性和用户体验。在这篇博客中,我们将介绍如何在Spring Boot中进行全局异常的封装和统一处理。
全局异常处理能够捕获应用中所有未处理的异常,统一进行处理,防止异常信息泄露到客户端,同时也能够记录异常信息以便后续的调试和分析。
接下来就用SpringBoot实例代码实现一个简单的全局异常拦截。

创建全局异常类

首先,我们需要创建一个自定义的全局异常类,继承自RuntimeException,用于封装业务异常信息。

java 复制代码
/**
可直接进行throw该异常类进行返回信息
**/
public class CustomException extends RuntimeException {
    //错误码枚举
    private final ErrorCode errorCode;

    public CustomException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.errorCode = errorCode;
    }

    public ErrorCode getErrorCode() {
        return errorCode;
    }
}

创建错误码枚举

为了更好地封装异常信息,我们创建一个错误码的枚举类,用于定义异常码和异常信息。

java 复制代码
public enum ErrorCode {
    SUCCESS("10000", "success"),
    SYSTEM_ERROR("500", "系统系统,请联系管理员"),
    NOT_FOUNT("404","未找到对应的资源");

    // 其他错误码...

    private final String code;
    private final String message;

    ErrorCode(String code, String message) {
        this.code = code;
        this.message = message;
    }

    public String getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

创建全局异常处理器

然后,我们创建一个全局异常处理器,使用@ControllerAdvice注解,配合@ExceptionHandler注解处理各种异常。

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<Response> handleCustomException(CustomException ex) {
        ErrorCode errorCode = ex.getErrorCode();
        return new ResponseEntity<>(Response.error(errorCode.getCode(), errorCode.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Response> handleOtherExceptions(Exception ex) {
        return new ResponseEntity<>(Response.error(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

创建错误响应类

最后,我们创建一个错误响应类,用于返回统一的错误格式。

java 复制代码
@Data
public class Response<T> {
    private  String code;
    private  String message;
    private T data;
    //默认的返回成功
    public static Response success(){
        Response response  =new Response();
        response.setCode(ErrorCode.SUCCESS.getCode());
        response.setMessage(ErrorCode.SUCCESS.getMessage());
        return response;
    }
    //带内容的返回成功
    public static <T> Response success(T data){
        Response<T> response  =new Response<T>();
        response.setCode(ErrorCode.SUCCESS.getCode());
        response.setData(data);
        response.setMessage(ErrorCode.SUCCESS.getMessage());
        return response;
    }
    //默认的返回失败
    public static Response error(){
        Response response  =new Response();
        response.setCode(ErrorCode.SYSTEM_ERROR.getCode());
        response.setMessage(ErrorCode.SYSTEM_ERROR.getMessage());
        return response;
    }
    //自定义的返回失败
    public static Response error(String code,String msg){
        Response response  =new Response();
        response.setCode(code);
        response.setMessage(msg);
        return response;
    }
}

测试

现在,我们可以在业务代码中通过抛出CustomException来触发全局异常处理,例如:

java 复制代码
@RestController
@RequestMapping("/api/test")
public class TestConroller {
    @GetMapping("/success")
    public ResponseEntity<Response> successObj(){
        return ResponseEntity.ok(Response.success("111111"));
    }
    @GetMapping("/error")
    public ResponseEntity<Response> error(String name) {
    //传入的name等于张三时,抛出我们的异常处理。
        if(StringUtils.equals(name,"zhangsan")){
            throw new CustomException(ErrorCode.SYSTEM_ERROR);
        }
        return ResponseEntity.ok(Response.success());
    }
}    

访问:/api/test/success 返回:

json 复制代码
{
"code": "10000",
"message": "success",
"data": "111111"
}

访问:/api/test/error?name=zhangsan 返回:

json 复制代码
{
"code": "500",
"message": "系统系统,请联系管理员",
"data": null
}

通过以上步骤,我们成功地封装了全局异常并进行了统一处理。这种方式不仅提高了代码的可维护性,还使得异常信息的格式更加一致,方便客户端或其他系统进行处理。全局异常处理是一个非常值得关注的话题,尤其是在构建健壮的后端应用时。

相关推荐
wgego1 小时前
基础的反序列化一些总结(php和java)
java·开发语言·笔记
机建狂魔2 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
2601_963870182 小时前
【计算机毕业设计】基于Vue + Spring Boot的社区养老服务管理平台设计与实现
spring boot·后端·课程设计
山峰哥2 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
乐观的Terry2 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis
前端开发张小七2 小时前
Java 学习笔记 · 第二课:面向对象核心(封装、继承、多态)及接口与异常
java·后端·程序员
wangjialelele2 小时前
Selenium4 + Java Web自动化测试入门指南:从环境搭建到常用操作详解
java·开发语言·前端·测试工具·自动化
孙启超3 小时前
【AI应用开发】LangChain 中 Chain 和 Agent 核心区别?
java·人工智能·langchain·llm·rag·ai应用开发·agent loop
leoZ2313 小时前
实战复盘:用 Claude Code 从零搭一个 GitHub PR 统计工具
java·人工智能·python·深度学习·自然语言处理·github·llama
William Dawson3 小时前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot