首页 > 解决方案 > 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。

标签: pythonpython-3.xerror-handlingdiscord.py

解决方案


您应该查看事件处理程序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


推荐阅读