全局异常处理器

54 阅读2分钟
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import lombok.extern.slf4j.Slf4j;

// 日志注解,替代printStackTrace
@Slf4j
// 标识全局异常处理器(针对RestController)
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 捕获所有Exception类型的异常(兜底处理)
     * @param ex 捕获到的异常对象
     * @return 统一的错误响应Result
     */
    @ExceptionHandler(Exception.class)
    public Result handleGlobalException(Exception ex) {
        // 用日志记录异常(比printStackTrace更规范,便于线上排查)
        log.error("全局异常捕获: ", ex);
        // 返回友好提示 + 统一响应结构
        return Result.error("操作失败,请联系管理员");
    }

}
  • @RestControllerAdvice 注解

    • 核心作用:标识当前类是 全局异常处理类,且专门针对 Spring 中的 @RestController(接口层)生效
    • 底层逻辑:@RestControllerAdvice =  @ControllerAdvice(全局切面,可捕获所有控制器的异常)+ @ResponseBody
    • 实际用途:让异常处理逻辑与业务代码解耦,不用在每个接口里写 try-catch,统一管理所有接口的异常响应
  • @Slf4j 注解(Lombok 提供)

    • 核心作用:自动生成 org.slf4j.Logger 日志对象(变量名默认 log),无需手动写 private static final Logger log = LoggerFactory.getLogger(xxx.class)
    • 依赖前提:项目需引入 Lombok 依赖(通常 Spring Boot 项目会默认集成或手动添加)
    • 实际用途:替代 System.out.println 或 ex.printStackTrace(),规范输出异常日志(支持输出到文件、按级别过滤等)
  • @ExceptionHandler(Exception.class) 注解

    • 核心作用:指定当前方法专门处理 Exception 类型及其子类的异常(即 “兜底异常处理”,所有未被单独捕获的异常都会走到这里)
    • 参数说明:注解内的 Exception.class 是 “异常捕获范围”,若改为 NullPointerException.class 则只处理空指针异常
    • 方法参数:Exception ex 是捕获到的异常实例,包含异常信息、栈轨迹等,用于日志打印或排查问题
  • Result.error(...) 方法调用

    • 核心作用:返回 统一格式的错误响应Result 是自定义通用响应类)
    • 响应结构:通常包含 code(错误码,如 500)、msg(错误提示)、data(空值或错误详情),前端可按固定格式解析
    • 实际用途:避免异常直接抛给前端导致的 “白屏” 或 “杂乱错误信息”,给用户友好提示,同时让前端统一处理错误逻辑