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

discord.py斜杠命令错误处理失效,如何修复权限缺失提示?

解决Discord.py斜杠命令权限错误无提示的问题

问题原因

你当前的on_command_error事件仅处理传统前缀命令(如!kick),而@client.tree.command定义的斜杠命令属于Discord应用命令体系,它们的错误不会触发on_command_error。当斜杠命令抛出错误未被捕获时,Discord就会显示“Application did not respond”。

解决方案

针对斜杠命令,需要使用应用命令专属的错误处理机制,有两种实现方式:

方式1:全局斜杠命令错误处理

通过client.tree.error事件捕获所有斜杠命令的错误,补充你现有的错误处理逻辑:

import discord
from discord import app_commands

@client.tree.error
async def on_app_command_error(interaction: discord.Interaction, error: app_commands.AppCommandError):
    # 忽略命令未找到错误
    if isinstance(error, app_commands.CommandNotFound):
        return
    
    # 处理缺失权限/无权限错误
    elif isinstance(error, app_commands.MissingPermissions) or isinstance(error, discord.Forbidden):
        required_perm = error.missing_permissions[0] if isinstance(error, app_commands.MissingPermissions) else "未知权限"
        noperms_embed = discord.Embed(
            title="<a:wrong:1199385940263706765> ERROR",
            description=f"```\nNO PERMISSIONS TO USE THIS COMMAND\n```\n**REQUIRED PERMISSIONS:**\n```\n{required_perm}\n```",
            colour=0xf50000
        )
        # 检查是否已发送过响应,避免报错
        if interaction.response.is_done():
            await interaction.followup.send(embed=noperms_embed, ephemeral=True)
        else:
            await interaction.response.send_message(embed=noperms_embed, ephemeral=True)
    
    # 处理命令冷却错误
    elif isinstance(error, app_commands.CommandOnCooldown):
        cooldown_embed = discord.Embed(
            title="<a:wrong:1199385940263706765> ERROR",
            description=f"```\nYOU NEED TO WAIT {error.retry_after:.2f}s BEFORE TRYING THIS COMMAND AGAIN.\n```",
            colour=0xf50000
        )
        if interaction.response.is_done():
            await interaction.followup.send(embed=cooldown_embed, ephemeral=True)
        else:
            await interaction.response.send_message(embed=cooldown_embed, ephemeral=True)
    
    # 处理缺失角色错误
    elif isinstance(error, app_commands.MissingRole):
        # 替换为你需要检查的命令名
        if interaction.command.name in ["premium_cmd"]:
            if interaction.response.is_done():
                await interaction.followup.send("你需要开通高级权限才能使用此命令", ephemeral=True)
            else:
                await interaction.response.send_message("你需要开通高级权限才能使用此命令", ephemeral=True)
    
    # 其他未知错误
    else:
        error_embed = discord.Embed(
            title="<a:wrong:1199385940263706765> ERROR",
            description=f"**发生未知错误!**\n__请将以下错误代码发送给开发者:__\n```\n{error}\n```",
            colour=0xf50000
        )
        if interaction.response.is_done():
            await interaction.followup.send(embed=error_embed, ephemeral=True)
        else:
            await interaction.response.send_message(embed=error_embed, ephemeral=True)

方式2:单个斜杠命令绑定错误处理

如果只想给特定斜杠命令添加错误处理,可以用@command.error装饰器:

@client.tree.command(name="ban", description="封禁成员")
@app_commands.describe(user="要封禁的成员", reason="封禁理由")
async def ban_command(interaction: discord.Interaction, user: discord.Member, reason: str = "无理由"):
    await user.ban(reason=reason)
    await interaction.response.send_message(f"已封禁 {user.mention}")

# 该命令的专属错误处理
@ban_command.error
async def ban_error(interaction: discord.Interaction, error: app_commands.AppCommandError):
    if isinstance(error, app_commands.MissingPermissions):
        await interaction.response.send_message(f"你缺少权限:{error.missing_permissions[0]}", ephemeral=True)

关键注意事项

  • 斜杠命令的上下文是discord.Interaction,而非前缀命令的commands.Context,必须用interaction.response.send_message或interaction.followup.send发送消息
  • 使用ephemeral=True可让错误提示仅触发命令的用户可见,避免刷屏
  • 必须检查interaction.response.is_done(),如果bot已对交互做出过响应,就必须用followup.send,否则会报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:27