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

#java #discord #discord-jda

#java #Discord #discord-jda

Вопрос:

Моя 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 .

Ответ №1:

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

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

Пример:

 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 только для того, чтобы сообщить вам, откуда в вашем коде возникла ошибка. Поскольку фактическое исключение происходит в других потоках, которые не дают вам контекста для поиска проблемы.

Ответ №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();
        }
    }
);
 

Комментарии:

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