Spring Boot 实现全局异常处理

在Spring Boot中,实现全局异常处理是一个常见的需求,它可以帮助我们集中处理应用中可能抛出的异常,并返回统一的响应格式给前端。这不仅可以减少代码重复,还能提高应用的可维护性和用户体验。

下面是一个简单的Spring Boot全局异常处理的实现步骤:

1. 创建自定义异常类(可选)

首先,你可以根据需要创建一些自定义异常类,以便在业务逻辑中抛出这些具体的异常。这样做的好处是可以让异常更加语义化,方便后续的处理和日志记录。

复制代码
public class CustomException extends RuntimeException {  
    private static final long serialVersionUID = 1L;  
  
    private String errorCode;  
  
    public CustomException(String message, String errorCode) {  
        super(message);  
        this.errorCode = errorCode;  
    }  
  
    // Getter 和 Setter  
    public String getErrorCode() {  
        return errorCode;  
    }  
  
    public void setErrorCode(String errorCode) {  
        this.errorCode = errorCode;  
    }  
}

2. 创建全局异常处理器

接下来,创建一个全局异常处理器,通过@ControllerAdvice@RestControllerAdvice(如果你使用的是RESTful服务)注解来标注这个类,然后使用@ExceptionHandler注解来指定它要处理的异常类型。

复制代码
@RestControllerAdvice  
public class GlobalExceptionHandler {  
  
    @ExceptionHandler(value = Exception.class)  
    public ResponseEntity<Object> handleAllExceptions(Exception e) {  
        // 这里可以根据具体的异常类型进行更细致的处理  
        // 例如,如果捕获到CustomException,则可以返回更具体的错误码和信息  
  
        // 简单的示例:返回状态码500和异常信息  
        ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR.value(), "Internal Server Error");  
        return new ResponseEntity<>(apiError, HttpStatus.INTERNAL_SERVER_ERROR);  
    }  
  
    @ExceptionHandler(value = CustomException.class)  
    public ResponseEntity<Object> handleCustomException(CustomException e) {  
        ApiError apiError = new ApiError(e.getErrorCode(), e.getMessage());  
        return new ResponseEntity<>(apiError, HttpStatus.valueOf(e.getErrorCode().startsWith("4") ? Integer.parseInt(e.getErrorCode().substring(0, 3)) : HttpStatus.INTERNAL_SERVER_ERROR.value()));  
    }  
  
    // ApiError 是一个简单的POJO类,用于封装错误信息  
    private static class ApiError {  
        private int status;  
        private String message;  
  
        public ApiError(int status, String message) {  
            this.status = status;  
            this.message = message;  
        }  
  
        // Getter 和 Setter  
    }  
}

注意:ApiError是一个简单的POJO类,用于封装错误信息,你可以根据实际需求调整它的结构。

3. 测试全局异常处理

现在,你可以在应用的任何地方抛出异常,并查看全局异常处理器是否正确地捕获并处理了这些异常。

4. 注意事项

  • 确保你的全局异常处理器类被Spring Boot扫描到,通常这意味着它应该位于Spring Boot的主类或启动类所在的包或子包中。
  • 根据你的应用需求,你可能需要为不同类型的异常编写多个@ExceptionHandler方法。
  • 考虑将异常信息记录到日志中,以便在问题发生时进行追踪和调试。
  • 如果你的应用是RESTful服务,并且你希望为前端返回统一的响应格式,那么使用@RestControllerAdviceResponseEntity是一个很好的选择。
相关推荐
陈随易36 分钟前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
鱼樱前端1 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
犀利豆2 小时前
Claude code tools 研究系列-开篇(AskUserQuestion)
后端
头发还在的女程序员2 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats2 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123453 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
颜酱5 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端
都叫我大帅哥5 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.5 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
IT_陈寒6 小时前
SpringBoot自动配置坑了我一周,原来问题这么蠢!
前端·人工智能·后端