Java中不能直接用自定义异常实现操作拦截,但可通过“抛出自定义异常+try-catch/AOP/全局处理器”组合达成拦截效果:先定义语义清晰的异常(如PermissionDeniedException),再在业务逻辑中主动抛出或用AOP切面统一拦截,最后由@ControllerAdvice统一响应。

Java 中不能直接用自定义异常“实现操作拦截”,因为异常本身是错误信号,不是控制流程的工具。但你可以结合自定义异常 + 异常处理机制(如 try-catch、AOP、Spring 的 @ExceptionHandler 或全局异常处理器),在特定操作发生时主动抛出异常,从而中断执行、跳转逻辑或统一响应——这常被开发者称为“通过异常做拦截”。关键在于:抛得合理、捕得及时、处理得当。
定义语义清晰的自定义异常
自定义异常应明确表达业务意图,而非掩盖逻辑问题。比如用户权限不足、参数非法、资源不可用等场景,适合用受检或非受检异常区分处理策略:
- 继承 RuntimeException(非受检):适合运行时业务规则拦截,调用方无需强制 try-catch,便于 AOP 统一处理
- 继承 Exception(受检):适合必须显式处理的可恢复拦截,如文件不存在需重试
示例:
public class PermissionDeniedException extends RuntimeException {public PermissionDeniedException(String message) {
super(message);
}
}
在关键操作前主动抛出异常(手动拦截)
在业务方法中,根据条件判断是否允许继续执行。不满足则立即抛出自定义异常,中断后续逻辑:
立即学习“Java免费学习笔记(深入)”;
if (!currentUser.hasRole("ADMIN")) {
throw new PermissionDeniedException("仅管理员可删除订单");
}
// 后续删除逻辑...
}
这种方式简单直接,适合核心校验点,但注意避免把大量校验逻辑散落在各处,后期难维护。
用 Spring AOP 统一拦截+抛异常(推荐)
将拦截逻辑抽取为切面,对指定方法(如带 @RequireAdmin 注解的方法)自动校验并抛异常,真正实现“操作拦截”的解耦:
- 定义注解:@Target(METHOD) @Retention(RUNTIME) public @interface RequireAdmin {}
- 编写切面:@Around("@annotation(RequireAdmin)") 方法内检查权限,不通过则 throw PermissionDeniedException
- 原方法只需加注解,无侵入性;异常由全局处理器统一返回友好提示
配合全局异常处理器统一响应(拦截后的收口)
抛出异常只是中断,真正实现“拦截效果”靠的是集中处理。Spring Boot 中可用 @ControllerAdvice 捕获自定义异常并返回标准结果:
@RestControllerAdvicepublic class GlobalExceptionHandler {
@ExceptionHandler(PermissionDeniedException.class)
public ResponseEntity<ApiResponse> handlePermissionDenied(PermissionDeniedException e) {
return ResponseEntity.status(403).body(ApiResponse.error("无权操作", 403));
}
}
这样前端收到统一格式的 403 响应,后端日志记录异常上下文,拦截就完成了闭环。


















