python - discord py - 如果检查不起作用,则命令错误处理程序
问题描述
我现在有一个奇怪的问题,从几天以来我都无法解决。我想为我的机器人的设置命令实现一个错误处理程序,但无论我尝试什么,它都不起作用。每次我都会收到我不想要的错误消息。当发生特定错误时,它应该每次都发送带有特定嵌入的聊天消息。
这就是我尝试过的:
@partner_setup.error
async def partner_setup_error(self, ctx, error):
if isinstance(error, commands.MissingPermissions):
embed = discord.Embed(title=f"`❌` - ES FEHLEN BOT-RECHTE!",
description=f"› Der Bot hat **nicht genügend Rechte**, um das Setup zu starten.\n\n**Solltest du ein Admin sein:**\nVergewissere dich das der Bot alle nötigen Rechte besitzt. Diese lauten:\n`- Kanäle & Nachrichten verwalten`\n`- Nachrichten lesen & senden`\n`- Einladungen erstellen`\n ⠀",
color=0xe74c3c)
embed.add_field(name="`` - Hast du eine wichtige Frage?", value="Solltest du ein Anliegen haben, zögere nicht und sende unserem <@671421220566204446> (`Bl4cklistSupport#7717`) Bot eine Private-Nachricht auf unserem Support-Server.\n\n**[Support Server](https://discord.gg/deutschland)** | **[Partner-Infos](https://bl4cklist.de/partner-faq)** | **[Regeln für Partner](https://bl4cklist.de/partner-faq)**")
embed.set_thumbnail(url="https://www.flaticon.com/premium-icon/icons/2183534.png")
await ctx.message.delete()
await ctx.send(embed=embed)
elif isinstance(error, commands.MaxConcurrencyReached):
embed = discord.Embed(title=f"`❌` - EIN SETUP LÄUFT BEREITS!",
description=f"› Um Probleme zu vermeiden, darfst du nur **ein Setup** gleichzeitig auf deinem Server ausführen. Es läuft bereits eins in einem anderen Kanal.\n ⠀",
color=0xe74c3c)
embed.add_field(name="`` - Hast du eine wichtige Frage?", value="Solltest du ein Anliegen haben, zögere nicht und sende unserem <@671421220566204446> (`Bl4cklistSupport#7717`) Bot eine Private-Nachricht auf unserem Support-Server.\n\n**[Support Server](https://discord.gg/deutschland)** | **[Partner-Infos](https://bl4cklist.de/partner-faq)** | **[Regeln für Partner](https://bl4cklist.de/partner-faq)**")
embed.set_thumbnail(url="https://www.flaticon.com/premium-icon/icons/2183534.png")
await ctx.message.delete()
await ctx.send(embed=embed)
elif isinstance(error, commands.CommandOnCooldown):
embed = discord.Embed(title=f"`❌` - WARTE EINEN MOMENT!",
description=f"› Du kannst nur alle **30 Sekunden** das Partner-Setup starten, um mögliche Fehler zu vermeiden.\n ⠀",
color=0xe74c3c)
embed.add_field(name="`` - Hast du eine wichtige Frage?", value="Solltest du ein Anliegen haben, zögere nicht und sende unserem <@671421220566204446> (`Bl4cklistSupport#7717`) Bot eine Private-Nachricht auf unserem Support-Server.\n\n**[Support Server](https://discord.gg/deutschland)** | **[Partner-Infos](https://bl4cklist.de/partner-faq)** | **[Regeln für Partner](https://bl4cklist.de/partner-faq)**")
embed.set_thumbnail(url="https://www.flaticon.com/premium-icon/icons/2183534.png")
await ctx.message.delete()
await ctx.send(embed=embed)
else:
embed = discord.Embed(title=f"`❌` - UNERWARTETER FEHLER",
description=f"› Es ist ein **unerwarteter Fehler aufgetreten**. Melde dich auf dem Support-Server und sage dem Server-Team bescheid!\n\n\n**FEHLERMELDUNG:**\n```py\n{error}```\n ⠀",
color=0xe74c3c)
embed.add_field(name="`` - Hast du eine wichtige Frage?", value="Solltest du ein Anliegen haben, zögere nicht und sende unserem <@671421220566204446> (`Bl4cklistSupport#7717`) Bot eine Private-Nachricht auf unserem Support-Server.\n\n**[Support Server](https://discord.gg/deutschland)** | **[Partner-Infos](https://bl4cklist.de/partner-faq)** | **[Regeln für Partner](https://bl4cklist.de/partner-faq)**")
embed.set_thumbnail(url="https://www.flaticon.com/premium-icon/icons/2183534.png")
await ctx.send(embed=embed)
print(error)
它应该向发生错误的通道发送一条消息,如您所见。但是每次get都是else:
触发端,我对此没有解释,这让我很困惑。我试图添加error = getattr(error, 'original', error)
,但这并没有什么不同。
编辑:在几次不同的尝试中,我得到了事件的真正错误消息,on_message
而不是我的命令。我self.client.process_commmands(message)
在这里用过。
我正在运行 Python 3.9 和 discord.py 1.7.2。
解决方案
您应该查看事件处理程序discord.on_command_error(ctx, error)
https://discordpy.readthedocs.io/en/latest/ext/commands/api.html?highlight=on_command_error#discord.on_command_error
你的方法应该是这样的
@commands.Cog.listener()
async def on_command_error(self, ctx, command_exception):
if isinstance(...
每次在同一个 cog 中引发 CommandError 时都会调用此方法
为了处理 python 异常(而不仅仅是命令错误),您需要查看 on_error https://discordpy.readthedocs.io/en/latest/api.html?highlight=on_error#discord.on_error
推荐阅读
- javafx - 如何在 NetBeans 12.1 上的 JavaFX 15 平台上安装 javadoc
- reactjs - 在路径“rowData.0.keyValues2”中检测到调度之间的状态突变。在农业网格中
- javascript - 扩展 HTMLButtonElement 的 WebComponent 没有调用 constructor() 和 connectedCallBack()
- javascript - 以动态方式单击所有子项的侦听器
- java - ROME 给我一个关于 DOCTYPE 的错误,但我的 XML 中没有 DOCTYPE 标记
- html - 无法在css中将元素移动到页面底部
- cypress - 无法登录 cypress 测试(500 错误)
- javascript - 如何使用 /a、/b 等更新 ref_no
- javascript - 如何在 vue.js 欢迎组件中使用引导程序而不是尾风 CSS
- javascript - JS LocalStorage 问题