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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:02