ContextException:无法捕获未知禁令(Discord Java)

ContextException: Unknown Ban can't be caught (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

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. Since queue(...) does asynchronous operations in a different thread, the exceptions cannot be thrown from here. Instead, you should use the failure callback as described by the documentation

您可以使用 ErrorHandler to handle specific 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 只是告诉您 您的 代码中错误的来源。由于实际异常发生在其他线程上,因此您没有上下文可以找到问题。