You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

关键修改说明

  1. 修正了erro的拼写错误,改用更直观的格式化字符串输出提示
  2. 用ctx.message.content.split()[0]获取用户实际输入的错误命令,替代无效的ctx.command
  3. 给发送操作加上try-except块,处理用户关闭私信的异常情况
  4. 确保return语句在处理完成后执行,彻底避免代码走到最后的print('1')

这样修改后,当用户输入不存在的命令时,会正确触发私信(或频道)提示,完全符合你预期的异常处理效果。

内容的提问来源于stack exchange,提问作者user9259249

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:16:00