Discord.ext CommandNotFound异常处理失效问题求助
解决Discord.py命令未找到错误处理失效的问题
看起来你的代码有几个小问题导致异常处理没按预期工作,我来帮你拆解一下:
问题分析
- 拼写错误触发隐性异常:你代码里的
erro是拼写错误,正确应该是error。这个小失误会让await ctx.author.send(...)这行直接抛出NameError,导致代码跳过return语句,最终走到print('1')。 ctx.command在CommandNotFound时无效:当触发CommandNotFound错误时,ctx.command的值是None——因为根本没匹配到任何命令,所以你用它格式化字符串会得到No command called 'None',完全不是你想要的效果。- 未处理DM发送失败的情况:如果用户关闭了私信权限,
ctx.author.send()会抛出Forbidden异常,同样会导致代码绕过return,执行到最后的打印语句。
修正后的代码
@bot.event async def on_command_error(ctx, error): # 捕获命令未找到的异常 if isinstance(error, commands.CommandNotFound): # 提取用户输入的错误命令(取消息第一个词) invalid_command = ctx.message.content.split()[0] try: # 尝试发送私信提示 await ctx.author.send(f"错误 | 没有名为`{invalid_command}`的命令") except discord.Forbidden: # 发不了私信就直接在频道提示 await ctx.send(f"{ctx.author.mention},我无法给你发送私信,请开启私信功能后重试") # 处理完成后返回,阻止后续代码执行 return # 其他类型错误的处理逻辑可以放在这里 print('1')
关键修改说明
- 修正了
erro的拼写错误,改用更直观的格式化字符串输出提示 - 用
ctx.message.content.split()[0]获取用户实际输入的错误命令,替代无效的ctx.command - 给发送操作加上
try-except块,处理用户关闭私信的异常情况 - 确保
return语句在处理完成后执行,彻底避免代码走到最后的print('1')
这样修改后,当用户输入不存在的命令时,会正确触发私信(或频道)提示,完全符合你预期的异常处理效果。
内容的提问来源于stack exchange,提问作者user9259249
相关产品推荐
相关产品推荐

