Моя команда 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
.
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();
}
}
);
Ваше исключение в данном случае даже не 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
только для того, чтобы сказать вам, где в вашем коде возникла ошибка. Поскольку фактическое исключение происходит в других потоках, которые не дают вам контекста для поиска проблемы.
Для этого лучше использовать ErrorHandler.