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
相关产品推荐
相关产品推荐

