Click: How to customize "Error: No such command xx" error handling with Click?
Click: How to customize "Error: No such command xx" error handling with Click?
我有一个正在开发的 Click 应用程序,我想自定义(从而覆盖)当调用未知的 command/subcommand 时 Click 的默认行为。
目前只有这条错误消息:Error: No such command xx
之后的代码不再执行。
我的初始设置是这样的:
@click.group(cls=CustomHelpOrder)
@click.option('-v', '--verbose',is_flag=True)
def myapp_cli(verbose):
if verbose:
do_verbose()
else:
do_not_verbose()
@myapp_cli.command(help_priority=1, short_help='Foo my project')
@click.option('--bar')
def baz(bar: str) -> None:
"""
Do something
"""
do_something(bar)
所以我想做的是:
- 检查是否引发了上述(特殊)异常。 (也许如果用户键入
bat
而不是 baz
)
- 如果是,我想保存这个未知命令(如
bat
(而不是只打印默认消息并退出)并将其用于进一步处理(如将其传递给各种函数(作为字符串也许))
我试过了
try:
myapp_cli()
except Click.Exception:
handleExc()
但我无法弄清楚如何执行此操作,因为如果命令未知,应用程序就会退出(我认为在任何东西都可以捕获它之前;一种非常幼稚的方法)。
我想知道我是否必须以某种方式覆盖默认行为,但由于我对 Click 还很陌生,所以我不知道该怎么做。
如有任何帮助,我将不胜感激。
您好 Farwent,欢迎光临!
您可以实现自己的自定义组。来自 Click's manual:
class AliasedGroup(click.Group):
def get_command(self, ctx, cmd_name):
rv = click.Group.get_command(self, ctx, cmd_name)
if rv is not None:
return rv
matches = [x for x in self.list_commands(ctx)
if x.startswith(cmd_name)]
if not matches:
return None
elif len(matches) == 1:
return click.Group.get_command(self, ctx, matches[0])
ctx.fail('Too many matches: %s' % ', '.join(sorted(matches)))
在上面的代码片段中,您可以编辑以下部分来处理您的 Command not found
案例。
if not matches:
# your custom logic for `Command not found` goes here
希望对您有所帮助!
我有一个正在开发的 Click 应用程序,我想自定义(从而覆盖)当调用未知的 command/subcommand 时 Click 的默认行为。
目前只有这条错误消息:Error: No such command xx
之后的代码不再执行。
我的初始设置是这样的:
@click.group(cls=CustomHelpOrder)
@click.option('-v', '--verbose',is_flag=True)
def myapp_cli(verbose):
if verbose:
do_verbose()
else:
do_not_verbose()
@myapp_cli.command(help_priority=1, short_help='Foo my project')
@click.option('--bar')
def baz(bar: str) -> None:
"""
Do something
"""
do_something(bar)
所以我想做的是:
- 检查是否引发了上述(特殊)异常。 (也许如果用户键入
bat
而不是baz
) - 如果是,我想保存这个未知命令(如
bat
(而不是只打印默认消息并退出)并将其用于进一步处理(如将其传递给各种函数(作为字符串也许))
我试过了
try:
myapp_cli()
except Click.Exception:
handleExc()
但我无法弄清楚如何执行此操作,因为如果命令未知,应用程序就会退出(我认为在任何东西都可以捕获它之前;一种非常幼稚的方法)。
我想知道我是否必须以某种方式覆盖默认行为,但由于我对 Click 还很陌生,所以我不知道该怎么做。
如有任何帮助,我将不胜感激。
您好 Farwent,欢迎光临!
您可以实现自己的自定义组。来自 Click's manual:
class AliasedGroup(click.Group):
def get_command(self, ctx, cmd_name):
rv = click.Group.get_command(self, ctx, cmd_name)
if rv is not None:
return rv
matches = [x for x in self.list_commands(ctx)
if x.startswith(cmd_name)]
if not matches:
return None
elif len(matches) == 1:
return click.Group.get_command(self, ctx, matches[0])
ctx.fail('Too many matches: %s' % ', '.join(sorted(matches)))
在上面的代码片段中,您可以编辑以下部分来处理您的 Command not found
案例。
if not matches:
# your custom logic for `Command not found` goes here
希望对您有所帮助!