ContextException: Неизвестный бан не может быть пойман (Discord Java)

Моя команда unban иногда выдает ContextException, когда вы разблокируете человека, который не был забанен. Я хотел поймать это с помощью блока try catch, чтобы уведомить пользователя о том, что человек, которого он пытается разбанить, не забанен. Вот что я пробовал:

try {
   event.getGuild().unban(event.getMessage().getContentRaw().substring(8)).queue();
} catch(ContextException e) {
   event.getChannel().sendMessage("This user isn't banned!").queue();
   return;
}

Но строка catch() просто говорит Exception 'net.dv8tion.jda.api.exceptions.ContextException' is never thrown in the corresponding try block.

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

Ответы 2

ContextException обрабатывает асинхронное исключение. Таким образом, ваш блок try не может поймать исключение. Вы можете изменить свой код следующим образом.

event.getGuild().unban(event.getMessage().getContentRaw().substring(8)).queue(
    null,
    (error) -> {
        if (error.getMessage().equals("10026: Unknown Ban")) {
            event.getChannel().sendMessage("This user isn't banned!").queue();
        }
    }
);

Для этого лучше использовать ErrorHandler.

Minn 14.12.2020 15:25
Ответ принят как подходящий

Ваше исключение в данном случае даже не ContextException, а ErrorResponseException . Поскольку queue(...) выполняет асинхронные операции в другом потоке, исключения не могут быть выброшены отсюда. Вместо этого вы должны использовать обратный вызов ошибки, как описано в документации.

Вы можете использовать ErrorHandler для обработки определенных ErrorResponses.

Пример:

String userId = event.getMessage().getContentRaw().substring(8);
ErrorHandler handler = new ErrorHandler().handle(ErrorResponse.UNKNOWN_BAN, (error) -> {
    event.getChannel().sendMessage("This user isn't banned!").queue();
});

event.getGuild()
     .unban(userId)
     .queue(null, handler);

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

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