如何捕获discord.py中commands.dm_only()校验失败错误并自定义处理逻辑
Discord.py dm_only校验失败自定义提示实现方案
discord.ext.commands 提供的dm_only装饰器校验失败时,会抛出discord.ext.commands.PrivateMessageOnly类型的错误,你可以通过错误处理器捕获该错误,实现公屏提示的需求,以下是两种实现方式:
方式1:单命令局部错误处理
适合仅需要处理单个命令的校验错误场景,不会影响其他命令的错误逻辑:
import discord from discord.ext import commands client = commands.Bot(command_prefix = '/') @commands.command() @commands.dm_only() async def private_command(ctx): # 你的命令业务逻辑 await ctx.send("命令执行成功,当前为私聊场景") # 给上述命令绑定专属错误处理器 @private_command.error async def private_command_error(ctx, error): # 判定错误是否为私聊校验失败 if isinstance(error, commands.PrivateMessageOnly): # 在当前触发命令的频道(公屏)发送提示 await ctx.send("⚠️ 该命令仅支持在私聊(DM)中使用,请前往机器人私聊窗口触发") # 抑制错误,避免控制台输出冗余报错 return # 其他类型错误保留默认处理逻辑 raise error client.add_command(private_command) client.run(bot_token)
方式2:全局错误处理
适合存在多个dm_only命令,需要统一处理校验失败逻辑的场景:
import discord from discord.ext import commands client = commands.Bot(command_prefix = '/') @commands.command() @commands.dm_only() async def command1(ctx): # 命令1业务逻辑 pass @commands.command() @commands.dm_only() async def command2(ctx): # 命令2业务逻辑 pass # 全局命令错误处理器 @client.event async def on_command_error(ctx, error): if isinstance(error, commands.PrivateMessageOnly): await ctx.send("⚠️ 该命令仅支持在私聊(DM)中使用,请前往机器人私聊窗口触发") return # 其他错误按你预设的逻辑处理,没有特殊需求可直接抛出 raise error client.add_command(command1) client.add_command(command2) client.run(bot_token)
内容的提问来源于stack exchange,提问作者CodeIsLaw
相关产品推荐
相关产品推荐

