Java 获取未声明的HrowableException而不是我自己的异常

Java 获取未声明的HrowableException而不是我自己的异常,java,aop,aspect,Java,Aop,Aspect,我有以下代码 public Object handlePermission(ProceedingJoinPoint joinPoint, RequirePermission permission) throws AccessException, Throwable { System.out.println("Permission = " + permission.value()); if (user.hasPermission(permission.value())) {

我有以下代码

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");
    }

}

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

AccessException
是一个选中的异常,但它是从没有在其
throws
子句中声明它的方法中抛出的(实际上是从拦截该方法的方面)。这在Java中是一种异常情况,因此您的异常被包装为
未声明的HrowableException
,这是未选中的


要按原样获取异常,您可以在方面拦截的方法的
throws
子句中声明它,或者使用另一个未检查的异常(即
RuntimeException
的子类)而不是
AccessException
+1。我只想补充一点,在这些情况下,
未声明的hrowableexception
包装原始异常
getCause()
将返回
AccessException
。我在拦截的方法中声明了AccessException。将AccessException更改为extend RuntimeException有效。如果您是被捕获的代码的作者,则可以阅读@EdgeCaseBerg和其他任何人,我认为我被代理问题所困扰,但随后使用了抛出新的
ValidationException('delete.failure',s.errors')
-然后返回正确的消息,而不是
未声明的HrowableException
,这是
RuntimeException
返回的消息在我的案例中,在方法中声明
抛出ClassNotFoundException
无效,但将异常包装在
RuntimeException
中确实有帮助(
抛出新的RuntimeException(e)
)。对于某些上下文:我在gradle
@TaskAction
注释的方法中使用它