获取UndeclaredThrowableException而不是我自己的异常

use*_*201 47 java aop

我有以下代码

public Object handlePermission(ProceedingJoinPoint joinPoint, RequirePermission permission) throws AccessException, Throwable {
    System.out.println("Permission = " + permission.value());
    if (user.hasPermission(permission.value())) {
        System.out.println("Permission granted ");
        return joinPoint.proceed();
    } else {
        System.out.println("No Permission");
        throw new AccessException("Current user does not have required permission");
    }

}
Run Code Online (Sandbox Code Playgroud)

当我使用没有权限的用户时,我得到的java.lang.reflect.UndeclaredThrowableException不是AccessException.

axt*_*avt 79

AccessException是一个经过检查的异常,但它是从未在其throws子句中声明它的方法抛出的(实际上 - 从拦截该方法的方面).这是Java中的一个异常情况,因此您的异常将被包装UndeclaredThrowableException,这是未选中的.

要按原样获取异常,您可以throws在方法截获的方法的子句中声明它,或者使用另一个未经检查的异常(即子类RuntimeException)而不是AccessException.

  • 如果您是使用"UndeclaredThrowableException"捕获的代码的作者,那么阅读[这篇有一些细节的帖子]可能会很不错(http://amitstechblog.wordpress.com/2011/07/24/java-代理和 - UndeclaredThrowableException中/) (7认同)
  • +1.我只想在这些情况下添加"UndeclaredThrowableException"包装原始异常; `getCause()`将返回`AccessException`. (3认同)
  • 我在拦截的方法中声明了AccessException.更改AccessException以扩展RuntimeException. (2认同)