创建自定义注释以处理异常

Create custom annotation to handle exceptions

提问人:lapots 提问时间:4/17/2015 最后编辑:Dhanush Gopinathlapots 更新时间:12/11/2019 访问量:6789

问:

有没有办法创建自己的注释来处理异常?

我的意思是,例如,如果方法抛出一些异常,我想在方法上添加注释,而不是创建块 - 并且不需要使用 .try-catchtry-catch

例如,像这样的东西

public void method() {
    try {
        perform();
    } catch (WorkingException e) {
    }
}

@ExceptionCatcher(WorkingException.class)
public void method() {
    perform();
}
Java 异常 注解

评论

2赞 4/17/2015
这可能会有所帮助......它之前在 SO [using-annotations-for-exception-handling][1] [1] 上被问到:stackoverflow.com/questions/19389808/...
0赞 Darshan Lila 4/17/2015
@NeerajJain 如果 OP 想要注释怎么办?
0赞 Kuba 4/17/2015
@NeerajJain将异常传递给调用方法,OP 想要实现的就是通过注解处理异常,应该有可能,Mohit Gupta 已经提供了很好的链接throws

答:

0赞 Travieso 12/11/2019 #1

AspectJ 非常适合此用例。此代码将用 @ExceptionCatcher 注释的任何方法包装在 try-catch 中,检查引发的异常是否是应该处理的类型(基于@ExceptionCatcher中定义的类),然后运行自定义逻辑或重新引发。

注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface ExceptionCatcher {
    public Class<? extends Throwable>[] exceptions() default {Exception.class};
}

AspectJ 建议:

@Aspect
public class ExceptionCatchingAdvice {
    @Around("execution(@ExceptionCatcher * *.*(..)) && @annotation(ExceptionCatcher)")
    public Object handle(ProceedingJoinPoint pjp, ExceptionCatcher catcher) throws Throwable {
        try {
            // execute advised code
            return pjp.proceed();
        }
        catch (Throwable e) {
            // check exceptions specified in annotation contain thrown exception
            if (Arrays.stream(catcher.exceptions())
                      .anyMatch(klass -> e.getClass().equals(klass))) {
                // custom logic goes here
            }
            // exception wasn't specified, rethrow
            else {
                throw e;
            }
        }
    }
}