Skip to content

设置单个命令的exc_handlers会导致其他命令报错 #233

@axiangcoding

Description

@axiangcoding

Describe the bug
根据 #231 这里的描述,我在其中一个命令中注册了通用错误处理器,但是在另外一个命令中,在正确执行命令后,又必定匹配到 khl.command.exception.Exceptions.Lexer.NotMatched 的错误,导致回复异常消息

To Reproduce
最小demo为:

async def common_error_handler(cmd: command.Command, exc: Exception, msg: Message):
    logger.error(f"Command {cmd.name} raised an exception: {exc}")
    if isinstance(exc, Exceptions.Handler.ArgLenNotMatched):
        cm = CardTemplate.warning_card(
            card_title="参数长度错误",
            main_modules=[
                Module.Section("请检查命令是否正确"),
                Module.Section("如果你不知道应该如何使用,请查看文档"),
            ],
        )
    elif isinstance(exc, ArgParseError):
        cm = CardTemplate.warning_card(
            card_title="参数解析错误",
            main_modules=[
                Module.Section(f"**错误**:{exc}"),
                Module.Section("如果你不知道应该如何使用,请查看文档"),
            ],
        )
    else:
        cm = CardTemplate.danger_card(
            card_title="发生了一个未知错误",
            main_modules=[
                Module.Section(f"发生了一个未知错误:{type(exc)} {exc}"),
                Module.Section("请重试。如果无法解决,请联系开发者"),
            ],
        )
    await msg.reply(cm.get_card_message())


default_exc_handlers: dict[Any, TypeEHandler] = {
    Exception: common_error_handler,
}

@bot.command(
      name="直播",
      aliases=["live"],
      exc_handlers=common.default_exc_handlers,
  )
async def set_live(message: PublicMessage, cmd: str, room_id: str, notify_role: str = ""):
  ...

@bot.command(
      name="帮助",
      aliases=["help"],
  )
async def help(msg: Message):
    ...

此时,我调用 /prefix 帮助时,会回复两个命令,一个是正常的帮助回复,一个是通用错误处理器里的错误,并得到日志:

Expected behavior
在单个命令中设置exc_handlers不会影响到其他命令

Logs/Screenshots
image

报错是

2024-05-04 13:38:50.882 | ERROR    | wtbot.kook.commands.common:common_error_handler:12 - Command 直播 raised an exception: 

Environment

  • Python version: 3.11
  • khl.py version: 0.3.17
  • OS: Windows, Linux

Additional context
Add any other context about the problem here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions