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

