Можно ли применить два совета AfterThrows к одному и тому же pointcut, ограниченному конкретным типом исключения, где одно исключение является суперклассом другого, а в случае захвата подкласса выполняется только один совет?
Я хочу перевести исключения во время выполнения (как пользовательские, так и стандартные), исключаемые из уровня обслуживания, где в некоторых случаях я делаю определенный перевод, а затем получаю фрагмент типа "ловить все" совет перевести что-нибудь действительно неожиданное:
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex")
public void doTranslationAction(ResourceNotFoundException rnfex) {
// throw new WebApplicationException with Status.NOT_FOUND;
}
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "aex")
public void doTranslationAction(AuthorisationException aex) {
// throw new WebApplicationException with Status.NOT_AUTHORISED;
}
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "throwable")
public void doTranslationAction(Throwable throwable) {
// Log something here about this unexpected exception
// throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR
}
Я обнаружил, что в этом случае, если я выбрасываю исключение, которое явно обрабатывается, то вызывается правильный метод, генерируется переведенное исключение, которое затем захватывается более широким советом «Throwable», а затем снова переводится в всеобъемлющий INTERNAL_SERVER_ERROR WAE. Это не неожиданно, но просто не совсем то, что я искал.
Чтобы обойти это, у меня есть один совет, который собирает все типы Throwable и затем использует instanceof, чтобы решить, является ли это ожидаемым пользовательским исключением времени выполнения, которое я могу перевести в конкретный WAE или нет.
Если я когда-либо увижу «instanceof», я уверен, что сделал что-то, за что стыдно, но я не уверен, есть ли лучший способ решить эту проблему без него?
Я также против преобразования ожидаемых пользовательских исключений в проверенные исключения и последующего перехвата исключения времени выполнения в качестве перехвата всех, что может быть одним из решений.