当我尝试将错误处理程序与 discord.py 一起使用时,“忽略 on_command_error 中的异常”

Posted

技术标签:

【中文标题】当我尝试将错误处理程序与 discord.py 一起使用时,“忽略 on_command_error 中的异常”【英文标题】:"Ignoring exception in on_command_error" when I try to use my error handler with discord.py 【发布时间】:2021-02-17 04:07:41 【问题描述】:

我为任何有参数提及通道的命令添加了一个简单的错误处理程序。如果您提到了无效频道,它将发送错误消息。这是处理程序:

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.ChannelNotFound):
        await ctx.send('Oops, thats not a channel!')
        return
    raise error

但它没有发送错误消息,而是将其放在控制台中:

Ignoring exception in on_command_error
Traceback (most recent call last):
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\client.py", line 333, in _run_event
    await coro(*args, **kwargs)
  File "pogtato.py", line 39, in on_command_error
    raise error
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\bot.py", line 903, in invoke
    await ctx.command.invoke(ctx)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 851, in invoke
    await self.prepare(ctx)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 786, in prepare
    await self._parse_arguments(ctx)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 697, in _parse_arguments
    transformed = await self.transform(ctx, param)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 552, in transform
    return await self.do_conversion(ctx, converter, argument, param)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 505, in do_conversion
    return await self._actual_conversion(ctx, converter, argument, param)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\core.py", line 451, in _actual_conversion
    ret = await instance.convert(ctx, argument)
  File "C:\Users\mmein\AppData\Local\Programs\Python\Python38-32\lib\site-packages\discord\ext\commands\converter.py", line 321, in convert
    raise ChannelNotFound(argument)
discord.ext.commands.errors.ChannelNotFound: Channel "yes" not found.

这是一个会引发错误的命令示例:

@bot.command()
async def chantest(ctx, channel : TextChannel):
    await ctx.send(channel.id)

该命令只是打印出标记频道的 ID,但是当我尝试使用该命令而不标记频道时应该会引发错误。

我不知道为什么会发生这种情况,如果您能提供帮助,请提前感谢。

【问题讨论】:

是的,我试图提及无效的频道“yes”。 您收到错误是因为您提出了错误,请参阅raise error 无论哪种方式都会出现同样的错误 @TinNguyen 不,他只提出不是 ChannelNotFound 错误的错误。如果他的command 抛出其中一个,他将进入 if 语句和 return,所以它不可能再次抛出同样的一个(因为它无法到达那部分代码) . 按照我的理解,我只是提出一个错误,它不是 ChannelNotFound 错误。由于删除 raise 错误似乎并没有解决任何问题,而且我还在其他有效的错误处理程序上对其进行了测试,但它破坏了它们,所以我不会更新我的帖子。 【参考方案1】:

您不需要on_command_error。尝试这样做,将通道的默认值设为“无”。

@bot.command()
async def chantest(ctx, channel : TextChannel=None):
    if not channel:
        await ctx.send('Oops, thats not a channel!')
        return

    await ctx.send(channel.id)

【讨论】:

if not channel: 更好 谢谢,我不久前发现了我的问题,我应该把它贴出来。我有多个错误处理程序,我必须将它们放入 1 个事件中。无论如何,我都会奖励赏金,因为这很有帮助。

以上是关于当我尝试将错误处理程序与 discord.py 一起使用时,“忽略 on_command_error 中的异常”的主要内容,如果未能解决你的问题,请参考以下文章

Discord.py — 尝试禁止用户后出现 UserNotFound 错误

当我尝试将 user_id 转换为 discord.py 上的成员用户名时,我不断收到 NoneType

discord.py 按内容获取消息

当我得到一个 pylint 错误时,正在使用 discord.py 的 Discord 意图,因为我得到一个 pylint 错误:“分配给属性”“未在类插槽中定义”

Discord.py 'NoneType' 对象没有属性 'send'

Discord.py(重写):错误处理函数中的“不正确的令牌”