SpringBoot错误处理机制详解

默认ref="/tag/152/" style="color:#2B406D;font-weight:bold;">错误处理行为

SpringBoot内置了一套自动化的错误处理机制。当应用发生异常时,比如访问一个不存在的接口或服务器内部出错,它会自动返回一个JSON格式的错误信息页面(在非浏览器请求中)或 whitelabel error page(浏览器直连时)。这种默认行为由ErrorMvcAutoConfiguration配置类驱动,适用于大多数基础场景。

自定义全局异常处理器

在实际项目中,直接暴露堆栈信息存在安全风险。可以通过 @ControllerAdvice 配合 @ExceptionHandler 实现统一拦截。例如,捕获所有 Controller 层抛出的 RuntimeException,并返回结构化响应:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<Map<String, Object>> handleRuntimeException() {
        Map<String, Object> body = new HashMap<>();
        body.put("timestamp", System.currentTimeMillis());
        body.put("message", "系统繁忙,请稍后再试");
        body.put("status", 500);
        return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

区分不同异常类型

可以针对 NullPointerException、IllegalArgumentException 等具体异常编写独立处理方法。这样前端能根据返回的状态码和 message 字段判断问题来源,而不是收到千篇一律的“服务器错误”。

替换默认错误页面

若希望关闭白标签页面并返回纯 JSON 数据,可在 application.yml 中设置:

server:
  error:
    whitelabel:
      enabled: false

同时实现 ErrorController 接口来自定义/error路径的行为,或者更推荐的方式是使用 Spring Boot 提供的 ErrorAttributes 进行数据定制。

结合日志记录提升排查效率

虽然对外要隐藏详细错误,但在服务端必须完整记录。可以在异常处理器中加入日志输出:

logger.error("请求异常:{}", ex.getMessage(), ex);

配合 ELK 或其他集中式日志系统,运维人员可快速定位攻击尝试、代码缺陷或非法输入,这对防范恶意探测尤为重要。

避免敏感信息泄露

某些框架异常可能携带类名、方法名甚至参数值。若不加过滤地返回给客户端,相当于把内部结构送给攻击者。建议在全局处理器中清洗数据,只保留必要字段。例如,禁用 stacktrace 的对外展示:

server:
  error:
    include-stacktrace: never

使用ResponseStatus注解声明式处理

对于业务层面已知的异常,如用户未登录、权限不足等,可以直接通过 @ResponseStatus 注解标记异常类:

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "权限不足")
public class AccessDeniedException extends RuntimeException {
}

这样在抛出该异常时,Spring会自动设置对应的状态码和响应体提示,减少重复代码的同时也降低了误配风险。