Общий обработчик исключений предотвращает обработку определенного исключения - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть приложение весенней загрузки, и там я обрабатываю исключения. У меня есть два метода обработки исключений на данный момент:

@ControllerAdvice
@RestController
public class MyExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    public final BaseResponse<GenericException> handleGenericExceptions(Exception ex, HttpServletRequest request) {
        ....
        return response;
    }

    @ExceptionHandler(MyCustomException.class)
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
    public final BaseResponse<MyCustomException> handleMyCustomException(MyCustomException ex, HttpServletRequest request) {
        ....
        return response;
    }
}

В какой-то момент я выбрасываю исключение MyCustomException, но при отладке я вижу, что оно обрабатывается методом handleGenericExceptions. Если я удаляю метод handleGenericExceptions, то он обрабатывается сообщением handleMyCustomException.

Я хочу, чтобы MyCustomException обрабатывался методом handleMyCustomException, а все остальные исключения - методом handleGenericExceptions. Класс MyCustomException расширяет класс Throwable. Что здесь не так?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

У меня нет 50 повторений, поэтому я ответил здесь, надеюсь, это имеет смысл.

У класса Throwable есть два важных подкласса: Ошибка и Исключение.Ваше MyCustomException расширяет Throwable.Весной, если ваш код выбрасывает что расширяет Throwable, Spring по умолчанию будет украшать его как IllegalStateException!Я вижу это в исходном коде Spring4.3, если вы хотите доказать это, вы добавляете @ExceptionHandler ({IllegalStateException}) и делаете MyCustomException неизменным, этот метод его поймает!

Вышеуказанное доказательство находится в org.springframework.web.method.support.InvocableHandlerMethod # doInvoke.

Кстати, мы обычно выкидываем Exception by extends RuntimeException, поэтому вы хотите создать Throwable.

0 голосов
/ 13 апреля 2019

Я нашел решение, но не знаю, почему это так.

Класс MyCustomException расширяет класс Throwable, я изменил его, чтобы вместо него расширить RunTimeException. Теперь он работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...