通过@ControllerAdvice统一处理异常,结合自定义异常类与日志记录,实现Java项目中异常的集中管理与标准化响应。

在Java中统一管理异常处理逻辑,核心是通过全局异常处理器、自定义异常类和日志记录相结合的方式,避免重复代码,提升可维护性。重点在于集中捕获和处理异常,而不是在每个方法中单独处理。
使用@ControllerAdvice处理Web层异常
在Spring Boot或Spring MVC项目中,@ControllerAdvice 是统一处理控制器层异常的关键注解。它能全局拦截所有Controller抛出的异常,并返回标准化的响应格式。
示例:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException e) {
ErrorResponse error = new ErrorResponse("BUSINESS_ERROR", e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
}
@ExceptionHandler(NotFoundException.class)
public ResponseEntity handleNotFoundException(NotFoundException e) {
ErrorResponse error = new ErrorResponse("NOT_FOUND", e.getMessage());
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
}
@ExceptionHandler(Exception.class)
public ResponseEntity handleUnexpectedException(Exception e) {
ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "系统内部错误");
// 记录详细日志
log.error("未预期异常:", e);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error);
}
}
这样所有Controller中抛出的异常都会被自动捕获并返回统一结构,前端更容易解析处理。
立即学习“Java免费学习笔记(深入)”;
定义分层的自定义异常体系
不要直接抛出Exception或RuntimeException,而是根据业务场景创建有意义的异常类型,比如:
- BusinessException:业务校验失败,如参数不合法、余额不足等
- ServiceException:服务层执行异常,如远程调用失败
- DataAccessException:数据库操作异常
这些异常可以继承RuntimeException,便于在事务中自动回滚,同时携带错误码和提示信息,方便前端展示。
结合AOP记录关键异常日志
对于需要额外监控的异常(如调用第三方接口失败),可以通过AOP在异常抛出时自动记录上下文信息,比如请求参数、用户ID等,有助于排查问题。
例如,在切面中捕获特定方法的异常并打点日志,而无需在每个方法里写log.error()。
统一API响应格式
配合全局异常处理,定义一致的返回结构,如:
{
"code": "BUSINESS_ERROR",
"message": "用户名已存在",
"timestamp": "2024-04-05T10:00:00"
}
这样前端可以统一根据code字段做不同处理,降低耦合。
基本上就这些。关键是把异常当成流程的一部分来设计,而不是补丁。合理分层、统一出口,代码会更清晰稳定。










