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

py-cord开发的Discord机器人触发错误监听时重复发送Embed如何解决

问题修复方案

核心原因

触发重复发送的本质是你的程序中存在两个有效的on_command_error错误处理器,两个处理器先后被触发各发了一次Embed,第二个处理器没有配置Embed颜色,所以出现一次红色、一次默认颜色的相同内容消息。常见的触发场景如下:

  • 除了当前Cog内的监听器外,主程序还定义了全局的on_command_error事件,两个处理器同时生效
  • 当前错误处理所属的Cog被重复加载了两次,同一个监听器被注册了两次
  • discord.py的错误默认会向上冒泡传播,你当前的处理逻辑没有标记错误为已处理,框架会继续把错误抛给上层的全局错误处理器执行

修复步骤

  1. 排查主程序代码,删除额外定义的全局on_command_error事件,统一只用当前Cog内的处理逻辑即可
  2. 检查Cog加载逻辑,确认同一个Cog没有被重复调用load_extension加载两次
  3. 在当前错误处理代码末尾添加错误已处理标记,阻止冒泡

优化后代码

@commands.Cog.listener()
async def on_command_error(self, ctx: commands.Context, error: commands.CommandError):
    
    if isinstance(error, commands.BadArgument):
        embed = discord.Embed(
            title = '!!! 参数错误 !!!', 
            description = f'请检查你输入的参数后重试。错误信息:{error}',
            color = 0xFF0000
        )
    elif isinstance(error, commands.MissingRole):
        embed = discord.Embed(
            title = '!!! 权限不足 !!!', 
            description = '你没有使用该命令的权限。',
            color = 0xFF0000
            )
    else:
        embed = discord.Embed (
            title = "!!! 未知错误 !!!",
            description = "发生了未知错误,已记录错误日志,我们会尽快排查处理。",
            color = 0xFF0000
        )
        # 原文件名存在拼写错误,已修正为正确的unknown
        with open("unknown_errors.txt", "a", encoding="utf-8") as f:
            f.write(f"{ctx} | {error}\n")
    
    await ctx.send(embed = embed)
    # 标记错误已处理,阻止向上冒泡触发其他错误处理器
    error.handled = True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:03