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

Discord.py无法捕获403错误:用户拒收私信的问题求助

解决Discord机器人私信发送失败的异常处理问题

我来帮你搞定这个异常处理的坑!你的核心问题是没把真正可能抛出错误的await member.send放进try块里,同时还存在缩进混乱、异常类型选得不对、异步调用漏加await这些小问题。

先拆解你尝试的代码里的问题:

  • try块只包裹了debug用的print语句,真正会报错的私信发送操作在try外面,等于白加了异常处理
  • 捕获的CommandInvokeError不是发送私信被拒时的正确异常,应该用discord.Forbidden(这是Discord.py专门用来表示权限不足/操作被拒绝的异常)
  • ctx.send(f"{member.display_name}" + resolvedmerror)没加await,异步函数里必须用await才能触发执行
  • 缩进错误导致ban操作和通知逻辑混乱,不管能不能发私信,你肯定都希望完成封禁操作对吧?

正确的代码实现:

import discord
from discord.ext import commands

@client.command(pass_context=True)
async def abandon(ctx):
    for member in ctx.guild.members:
        if len(member.roles) < 2:
            try:
                # 把可能报错的私信操作放进try块
                await member.send(f"Hello {member.display_name},\n\n" + banreason + banreason2 + banreason3)
                # 私信发送成功时的通知
                print(f"Banned {member.display_name} and invite links were sent.")
                await ctx.send(f"**{member.display_name}** was banned and invite links were sent. :white_check_mark:")
            except discord.Forbidden:
                # 捕获用户拒收私信的异常
                print(f"{member.display_name} was banned but couldn't send DMs (user has DMs disabled).")
                await ctx.send(f"**{member.display_name}** was banned, but couldn't send invite links (DMs disabled). :warning:")
            # 不管私信成功与否,都执行封禁操作
            await member.ban(reason="Executed due to deletion of the server. Invite links were sent in DMs.")
    print("Banning complete!")

关键修改说明:

  1. 把await member.send移入try块:这是唯一可能触发“无法发送消息”错误的操作,必须放在try范围内才能被捕获
  2. 使用精准的异常类型discord.Forbidden:比通用错误类型更准确,也能避免捕获到其他无关异常
  3. 给ctx.send补加await:所有异步函数调用都必须用await等待执行完成,否则代码会直接跳过这个操作
  4. 调整缩进逻辑:把ban操作放在try/except块外面,确保不管私信是否成功,都能完成封禁;同时在两个分支里分别处理成功和失败的通知,逻辑更清晰
  5. 优化了提示信息:让服务器管理员能直观看到哪个用户没收到私信,体验更友好

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 23:32:33