定义@HandleException注解并结合AOP实现异常统一处理,通过注解标记方法,AOP拦截异常并执行特定逻辑,减少重复代码,提升可读性与维护性。

在Java开发中,异常处理往往需要大量重复的try-catch代码,影响代码可读性。通过自定义注解结合AOP(面向切面编程),可以将异常处理逻辑集中管理,从而简化业务代码。
定义异常处理注解
创建一个注解用于标记需要特殊异常处理的方法:
@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)
public @interface HandleException {
Class extends Exception>[] value() default Exception.class;
String message() default "系统异常,请稍后重试";
}
该注解支持指定关注的异常类型和返回的提示信息。
使用AOP实现统一异常拦截
通过Spring AOP,在方法执行时自动捕获异常并按注解配置处理:
立即学习“Java免费学习笔记(深入)”;
@Aspect@Component
public class ExceptionHandlingAspect {
@Around("@annotation(handleException)")
public Object handle(ProceedingJoinPoint joinPoint, HandleException handleException) {
try {
return joinPoint.proceed();
} catch (Throwable throwable) {
Class extends Exception>[] exceptions = handleException.value();
for (Class extends Exception> exClass : exceptions) {
if (exClass.isInstance(throwable)) {
throw new BusinessException(handleException.message(), throwable);
}
}
throw new RuntimeException(throwable);
}
}
}
这样可以在不侵入业务逻辑的前提下完成异常转换与封装。
在业务方法中使用注解
只需在可能抛出异常的方法上添加注解即可:
@Servicepublic class UserService {
@HandleException(value = UserNotFoundException.class, message = "用户不存在")
public User findUser(Long id) {
// 模拟异常
if (id throw new UserNotFoundException("Invalid user id: " + id);
}
return new User(id, "test");
}
}
当调用findUser(-1L)时,会自动捕获UserNotFoundException,并抛出自定义的业务异常,前端接收到统一格式的错误提示。
基本上就这些。这种方式让异常处理更清晰,业务代码不再被try-catch淹没,同时保持了灵活性和可维护性。不复杂但容易忽略细节,比如注解的保留策略和AOP表达式的准确性。










