最常用规范方式是@ControllerAdvice+@ExceptionHandler配合统一响应体Result<T>;需定义code/message/data字段,分别处理BindException、NullPointerException等具体异常并兜底Exception,建议记录日志但不暴露堆栈。

在 Spring Boot 项目中,编写全局异常处理器最常用、最规范的方式是使用 @ControllerAdvice + @ExceptionHandler,配合统一响应结构,实现对所有控制器抛出异常的集中捕获与友好返回。
定义统一响应体
先设计一个标准的返回格式(如 Result<T>),包含状态码、消息、数据等字段,便于前后端约定一致:
- code:业务状态码(如 200 成功,500 服务器错误,400 参数异常)
- message:用户可读提示(避免暴露堆栈或敏感信息)
- data:正常返回的数据(异常时通常为 null)
创建全局异常处理器类
新建一个类,添加 @ControllerAdvice 注解,表示它作用于所有 @Controller 和 @RestController:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 用
@ExceptionHandler(XXXException.class)方法分别处理不同异常类型 - 优先捕获具体异常(如
IllegalArgumentException),再兜底处理Exception - 方法返回值通常是
Result<?>或ResponseEntity<Result<?>>
示例片段:
立即学习“Java免费学习笔记(深入)”;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
@ResponseBody
public Result<?> handleBindException(BindException e) {
String message = e.getBindingResult().getFieldErrors().get(0).getDefaultMessage();
return Result.fail(400, message);
}
@ExceptionHandler(NullPointerException.class)
@ResponseBody
public Result<?> handleNPE(NullPointerException e) {
log.error("空指针异常", e);
return Result.fail(500, "系统繁忙,请稍后再试");
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Result<?> handleGeneralException(Exception e) {
log.error("未预期异常", e);
return Result.fail(500, "服务内部错误");
}
}
补充说明与注意事项
- 若需区分 REST 接口和页面跳转,可用
@RestControllerAdvice(更常用,自动加@ResponseBody) - 异常处理方法里建议记录日志(含堆栈),但绝不直接返回给前端
- 对于
404、401、403等 HTTP 状态码,可通过@ResponseStatus或ResponseEntity显式设置 - Spring Boot 2.3+ 中,
ErrorResponse和ErrorWebExceptionHandler可用于 WebFlux 或自定义错误页,但常规 MVC 仍推荐@ControllerAdvice
验证是否生效
在任意 @RestController 方法中手动抛出测试异常(如 throw new IllegalArgumentException("参数错误")),调用接口后检查响应是否符合预期格式和状态码即可确认全局处理器已起作用。

















