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

Posted

技术标签:

【中文标题】ContextException:无法捕获未知禁令(Discord Java)【英文标题】:ContextException: Unknown Ban can't be caught (Discord Java) 【发布时间】:2021-03-24 20:41:55 【问题描述】:

我的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(...) 在不同的线程中进行异步操作,所以不能从这里抛出异常。相反,您应该使用documentation 中描述的失败回调。

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

【讨论】:

【参考方案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。

以上是关于ContextException:无法捕获未知禁令(Discord Java)的主要内容,如果未能解决你的问题,请参考以下文章

美出口禁令后 中兴或将无法使用Android系统

spring mvc 捕获所有路线,但只捕获未知路线

Discord.js 显示状态中的禁令数量

循环到未知 JSON 数据时如何在 allKeys 上捕获错误?

未捕获的未知 cloud_name

如何通过 *** 解决 Charles 上的未知路径