discord.py-rewrite - 通过 cogs 处理异常

discord.py-rewrite - Manipulating exceptions through cogs

所以,在我的主文件 bot.py 上,我有:

class Bot(commands.Bot):

    # BOT ATTRIBUTES

    class MyException(Exception):
        def __init__(self, argument):
            self.argument = argument

bot = Bot(...)

@bot.event
async def on_command_error(ctx, error):
    if isistance(error, bot.MyException):
        await ctx.send("{} went wrong!".format(error.argument))
    else:
        print(error)

现在我还有一个 cog 文件,有时我想在其中抛出 Bot().MyException 异常:

class Cog(commands.Cog):

    def __init__(self, bot):
        self.bot = bot

    @commands.command()
    async def a_command(self, ctx):
        if a_condition:
            raise self.bot.MyException("arg")

当我 运行 代码时,如果 a_condition 已经验证,程序会引发 MyException 异常,但 BOT 不会在 on_command_error() bot.py 中的函数。相反,异常会打印在控制台中,我收到此错误消息:

Command raised an exception: MyException: arg

谁能告诉我如何让 BOT 在 on_command_error() 中说出想要的消息 bot.py

命令只会引发源自 CommandError 的异常。当您的命令引发非 CommandError 异常时,它将被包装在 CommandInvokeError:

@bot.event
async def on_command_error(ctx, error):
    if isinstance(error, commands.CommandInvokeError):
        if isinstance(error.original, bot.MyException):
            await ctx.send("{} went wrong!".format(error.argument))
            return
    print(error)

@Patrick Haugh 非常感谢您提供此信息,我设法通过从 commands.CommandError 而不是 Exception 继承 MyException class 来解决这个问题。

基本上是这样写的:

class MyException(commands.CommandError):
        def __init__(self, argument):
            self.argument = argument

而不是:

class MyException(Exception):
        def __init__(self, argument):
            self.argument = argument

然后离开:

@bot.event
async def on_command_error(ctx, error):
    if isistance(error, bot.MyException):
        await ctx.send("{} went wrong!".format(error.argument))
    else:
        print(error)