Получение UndeclaredThrowableException вместо моего собственного исключения

У меня есть следующий код

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.


person user373201    schedule 30.03.2011    source источник


Ответы (1)


AccessException — проверенное исключение, но оно было выброшено из метода, который не объявляет его в своем предложении throws (фактически — из аспекта, перехватывающего этот метод). Это ненормальное состояние в Java, поэтому ваше исключение заключено в UndeclaredThrowableException, что не отмечено.

Чтобы получить ваше исключение как есть, вы можете либо объявить его в предложении throws метода, перехватываемого вашим аспектом, либо использовать другое непроверенное исключение (то есть подкласс RuntimeException) вместо AccessException.

person axtavt    schedule 30.03.2011
comment
+1. Я бы только добавил, что в этих ситуациях UndeclaredThrowableException оборачивает исходное исключение; getCause() вернет AccessException. - person Tomasz Nurkiewicz; 30.03.2011
comment
Я объявил AccessException в перехватывающем методе. Изменение AccessException для расширения RuntimeException сработало. - person user373201; 30.03.2011
comment
Если вы являетесь автором кода, который перехватывается с помощью UndeclaredThrowableException, может быть полезно прочитать эта запись с некоторыми подробностями - person EdgeCaseBerg; 30.01.2014
comment
@EdgeCaseBerg и кто-либо еще, я думаю, что я был пойман из-за проблемы с прокси, но затем использовал throw new ValidationException('delete.failure',s.errors) - это возвращало правильное сообщение вместо UndeclaredThrowableException, которое возвращал RuntimeException - person V H; 16.12.2016
comment
В моем случае объявление throws ClassNotFoundException в методе не сработало, но помогло обертывание исключения внутри RuntimeException (throw new RuntimeException(e)). Для некоторого контекста: я использовал его внутри аннотированного метода gradle @TaskAction - person futchas; 14.12.2017
comment
Эта ссылка не менее важна: - person ASharma7; 29.05.2019