推荐使用@controlleradvice+@exceptionhandler搭配自定义bizexception实现全局异常处理,统一返回result格式,并需记录日志、避免敏感信息泄露、匹配http状态码。

在 Spring Boot 项目中,推荐使用 @ControllerAdvice + @ExceptionHandler 搭配自定义异常类,实现全局统一异常拦截与标准化响应输出。
定义统一响应结构
先创建一个通用的返回体,确保所有接口(包括异常)都遵循同一 JSON 格式:
public class Result<t> {
private int code;
private String msg;
private T data;
public static <t> Result<t> success(T data) {
Result<t> r = new Result();
r.code = 200;
r.msg = "success";
r.data = data;
return r;
}
public static <t> Result<t> fail(int code, String msg) {
Result<t> r = new Result<t>();
r.code = code;
r.msg = msg;
return r;
}
// getter/setter 省略
}</t></t></t></t></t></t></t></t>
自定义业务异常类
让业务逻辑能主动抛出可识别、可分类的异常,便于后续精准捕获:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class BizException extends RuntimeException {
private int code;
public BizException(int code, String message) {
super(message);
this.code = code;
}
public BizException(String message) {
this(500, message);
}
// getter 省略
}
例如在 Service 中:if (user == null) throw new BizException(404, "用户不存在");
编写全局异常处理器
用 @ControllerAdvice 声明一个全局切面类,集中处理各类异常:
@RestControllerAdvice
public class GlobalExceptionHandler {
// 捕获自定义业务异常
@ExceptionHandler(BizException.class)
public Result<object> handleBizException(BizException e) {
return Result.fail(e.getCode(), e.getMessage());
}
// 捕获参数校验异常(@Valid)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<object> handleValidException(MethodArgumentNotValidException e) {
String msg = e.getBindingResult()
.getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.findFirst().orElse("参数校验失败");
return Result.fail(400, msg);
}
// 捕获空指针、数组越界等运行时异常(兜底)
@ExceptionHandler(RuntimeException.class)
public Result<object> handleRuntime(Exception e) {
// 生产环境建议记录日志,不暴露堆栈
log.error("系统未预期异常", e);
return Result.fail(500, "系统繁忙,请稍后再试");
}
// 可选:捕获所有异常(慎用,避免掩盖问题)
@ExceptionHandler(Exception.class)
public Result<object> handleAll(Exception e) {
return Result.fail(500, "服务异常");
}
}</object></object></object></object>
补充说明与建议
- 日志记录必不可少 —— 在每个
@ExceptionHandler方法里用log.error(..., e)记录完整堆栈,方便排查 - 敏感信息不外泄 —— 不要把
e.toString()或堆栈直接返回给前端,尤其生产环境 - HTTP 状态码要匹配 —— 如 404 异常用
ResponseEntity.status(HttpStatus.NOT_FOUND).body(...)更规范(可配合@ResponseStatus注解或返回ResponseEntity) - 全局异常不处理 Controller 层 try-catch 已捕获并吞掉的异常 —— 它们不会进入
@ControllerAdvice
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










