py-cord开发的Discord机器人触发错误监听时重复发送Embed如何解决
问题修复方案
核心原因
触发重复发送的本质是你的程序中存在两个有效的on_command_error错误处理器,两个处理器先后被触发各发了一次Embed,第二个处理器没有配置Embed颜色,所以出现一次红色、一次默认颜色的相同内容消息。常见的触发场景如下:
- 除了当前Cog内的监听器外,主程序还定义了全局的
on_command_error事件,两个处理器同时生效 - 当前错误处理所属的Cog被重复加载了两次,同一个监听器被注册了两次
- discord.py的错误默认会向上冒泡传播,你当前的处理逻辑没有标记错误为已处理,框架会继续把错误抛给上层的全局错误处理器执行
修复步骤
- 排查主程序代码,删除额外定义的全局
on_command_error事件,统一只用当前Cog内的处理逻辑即可 - 检查Cog加载逻辑,确认同一个Cog没有被重复调用
load_extension加载两次 - 在当前错误处理代码末尾添加错误已处理标记,阻止冒泡
优化后代码
@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
相关产品推荐
相关产品推荐

