Как перехватить исключение Reactor RetryExhaustedException?

У меня есть код, выдающий reactor.core.Exceptions$RetryExhaustedException, и я хотел бы перехватить это конкретное исключение.

Однако это RetryExhaustedException не общедоступный класс, это частный статический класс пакета в общедоступном классе реактора.core.Exceptions, поэтому я не могу просто поместить его в оператор catch. Поскольку исключение расширяется IllegalStateException, я мог бы это уловить, но это очень широкое исключение, с которым я бы предпочел вообще не обращаться.

(Обратите внимание, что я не говорю об устаревшем (публичном) классе reactor.retry.RetryExhaustedException. Это не то же самое исключение.)

Я принял ответ, который делает именно то, что я хочу, но я открыт для мысли, что у меня здесь XY-проблема (например, перехват этого исключения совершенно ошибочен), и я был бы признателен за ответы в этом направлении.

julaine 10.04.2024 14:55

Ответ, который я сейчас принял, использует только API публичного реактора, поэтому я немного более уверен, что то, чем я являюсь, имеет смысл.

julaine 11.04.2024 08:57

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

julaine 11.04.2024 08:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
288
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, вы могли бы сделать что-то вроде:

try {
    // Your reactive operations
} catch (IllegalStateException e) {
    if (e.getClass().getName().equals("reactor.core.Exceptions$RetryExhaustedException")) {
        // Handle the RetryExhaustedException case
    } else {
        throw e;  // rethrow the exception if it's not RetryExhaustedException
    }
}

но это не так элегантно. 🤢

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

julaine 10.04.2024 14:44

Однако я думаю, что изменю это на e.getClass().getName().contains("RetryExhaustedException"), что кажется более надежным в случае обновления реактора.

julaine 10.04.2024 14:48

Я изменил свой значок принятия на другой ответ, потому что он показывает, как это должно быть сделано. Тем не менее ваш ответ полезен для других закрытых классов исключений, которые могут быть созданы любой библиотекой. Я сохраню этот трюк в рукаве, надеясь, что он мне не понадобится.

julaine 11.04.2024 08:47
Ответ принят как подходящий

Я думаю, вы могли бы использовать метод Exceptions.isRetryExhausted(e), чтобы проверить, является ли данное исключение RetryExhausted.

Также с помощью этого класса вы можете проверять другие исключения из класса Exceptions, см. методы, начинающиеся с is....

Это путь. Идеальный.

julaine 11.04.2024 08:40

Другие вопросы по теме