discord.py全局错误处理无法捕获BotMissingPermissions,Forbidden 403报错如何处理
discord.py全局捕获Forbidden权限异常解决方案
异常未捕获的原因
你当前仅捕获了BotMissingPermissions异常,该异常是discord.py命令框架在执行命令前置权限校验(如命令添加了@commands.bot_has_permissions(...)装饰器)时主动抛出的包装类异常。而你遇到的discord.errors.Forbidden是底层API请求直接返回403时抛出的原生异常,通常出现在权限校验通过后、实际调用Discord API执行操作(发送消息、成员管理等)时触发,不会被自动包装为BotMissingPermissions,因此没有进入原有判断逻辑。
命令维度全局捕获方案
扩展原有的on_command_error逻辑,捕获被CommandInvokeError包裹的原生Forbidden异常,适配所有命令执行过程中出现的权限不足场景:
import discord from discord.ext import commands from discord.ext.commands import BotMissingPermissions, CommandInvokeError async def on_command_error(ctx, error): # 处理命令前置校验抛出的包装类权限异常 if isinstance(error, BotMissingPermissions): await ctx.send("我没有执行该命令所需的权限") return # 处理命令执行过程中抛出的原生Forbidden异常 if isinstance(error, CommandInvokeError): original_error = error.original if isinstance(original_error, discord.Forbidden) and original_error.code == 50013: await ctx.send("我没有执行该操作所需的权限") return # 其余异常处理逻辑可继续向下扩展
全场景全局捕获方案
如果需要捕获命令以外场景的Forbidden异常(如on_message事件回调、后台定时任务中的API调用),可以添加全局on_error事件处理器:
import sys import discord async def on_error(event, *args, **kwargs): exc_type, exc_value, _ = sys.exc_info() # 捕获权限不足类型的Forbidden异常 if isinstance(exc_value, discord.Forbidden) and exc_value.code == 50013: # 可根据需求自定义处理逻辑,如打日志、推送通知等 print(f"权限不足异常,触发事件:{event},错误详情:{exc_value}") return # 其余全局异常处理逻辑可继续向下扩展
注意事项
- 若单个命令单独定义了局部
on_error处理逻辑,该命令的异常默认不会进入全局on_command_error,需在局部处理逻辑中手动抛出异常或补充对应判断。 - 处理
Forbidden异常时建议额外判断错误码50013,该错误码对应明确的权限不足场景,避免误拦截其他403场景(如访问不存在的资源、被用户拉黑等)。
内容的提问来源于stack exchange,提问作者Need_Not
相关产品推荐
相关产品推荐

