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

如何捕获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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:09:03