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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 13:24:05