#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 .