discord.py的cog中如何为单个命令设置专属错误响应
问题根因
on_command_error是discord.py的全局命令错误事件,所有注册了该监听器的Cog都会收到全量的命令报错通知,所以单命令报错会触发所有Cog的错误响应。@命令名.error装饰器在Cog中完全可用,只是写法需要符合Cog的规范。
解决方案1:单个命令绑定专属错误处理
该方案可以实现和@kick.error、@ban.error完全一致的效果,错误响应只会绑定到对应命令,不会互相干扰,示例如下:
# kick.py 中KickCog的示例写法 from discord.ext import commands class KickCog(commands.Cog): def __init__(self, bot): self.bot = bot # 定义kick命令 @commands.command(name="kick") async def kick(self, ctx, member: commands.MemberConverter, *, reason=None): # 你的踢人逻辑 await member.kick(reason=reason) await ctx.send(f"已踢出用户 {member.mention}") # 绑定到kick命令的专属错误处理,装饰器用命令对应的函数名 @kick.error async def kick_error(self, ctx, error): if isinstance(error, commands.MissingRequiredArgument): await ctx.send("参数错误,正确用法:!kick @用户 [踢出原因]") elif isinstance(error, commands.MissingPermissions): await ctx.send("你没有踢出用户的权限")
如果你之前使用该装饰器不生效,大概率是错误处理函数没有和命令函数放在同一个Cog类内,或者装饰器用的是命令的触发别名而非实际的函数名,修正后即可正常运行。
解决方案2:Cog级统一错误过滤
如果你需要统一处理同一个Cog下所有命令的通用错误,不需要每个命令单独写错误处理,可以在on_command_error开头先做归属判断,不属于当前Cog的报错直接跳过即可:
@commands.Cog.listener() async def on_command_error(self, ctx, error): # 仅处理当前Cog下的命令报错 if ctx.command.cog != self: return # 后续写你原来的错误处理逻辑即可 if isinstance(error, commands.MissingRequiredArgument): await ctx.send('(对应当前Cog命令的提示文本)') if isinstance(error, commands.MissingPermissions): await ctx.send("(对应当前Cog命令的提示文本)")
内容的提问来源于stack exchange,提问作者Brandon Figueroa
相关产品推荐
相关产品推荐

