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

时间:2015-04-17 09:23:37

标签: java exception annotations

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

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

例如像

这样的东西
public void method() {
    try {
        perform();
    } catch (WorkingException e) {
    }
}

@ExceptionCatcher(WorkingException.class)
public void method() {
    perform();
}

1 个答案:

答案 0 :(得分:0)

AspectJ非常适合此用例。这段代码将在try-catch中包装任何用@ExceptionCatcher注释的方法,检查抛出的异常是否应该处理(基于@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;
            }
        }
    }
}