@exceptionhandler能抽离异常处理逻辑,通过@controlleradvice实现全局捕获,支持多类型匹配、参数注入与标准化响应,配合自定义异常区分业务与系统错误,并需确保异常不被中间层吞没。

Spring的@ExceptionHandler能将异常处理逻辑从Controller方法中抽离,避免每个接口都写重复的try-catch,让代码更简洁、职责更清晰。
统一异常处理器类
创建一个带@ControllerAdvice的类,它会作用于所有Controller。在其中用@ExceptionHandler标注处理特定异常的方法:
- 可以按异常类型(如
IllegalArgumentException.class)匹配 - 支持多个异常类型写在一个注解里:
@ExceptionHandler({IOException.class, SQLException.class}) - 方法参数可直接接收异常对象、
HttpServletRequest、Model等,无需手动捕获
返回标准化错误响应
异常处理方法通常返回ResponseEntity>或封装好的错误DTO,便于前端统一解析:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如返回
ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorDto) - 配合
@ResponseBody(在@RestControllerAdvice下自动生效)直接输出JSON - 避免在Controller里手动构造错误码、消息、时间戳等字段
区分业务异常与系统异常
建议自定义业务异常(如BusinessException),并在全局处理器中分层处理:
- 业务异常:记录日志但不打印堆栈,返回用户友好的提示
- 运行时异常(如
NullPointerException):记录完整堆栈,返回通用错误码,避免暴露敏感信息 - 可通过异常类名或标记接口(如
instanceof BusinessException)做判断
配合@ResponseStatus简化简单场景
如果某类异常只需返回固定HTTP状态码,不用定制响应体,可直接在异常类上加@ResponseStatus:
- 例如
@ResponseStatus(HttpStatus.NOT_FOUND)标注UserNotFoundException - Spring会自动返回对应状态码,无需额外写
@ExceptionHandler方法 - 适合状态码明确、响应内容统一的场景
不复杂但容易忽略的是异常传播路径——确保Controller抛出的异常未被中间层(如AOP、过滤器)提前吞掉,否则@ExceptionHandler不会触发。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










