python click子命令统一错误处理

mlj*_*jli 4 python python-click

如果有命令组并且每个子命令都可能引发异常,我如何在一个地方一起处理它们?

鉴于以下示例:

import click


@click.group()
def cli():
    pass

@cli.command()
def foo():
    pass

if __name__ == '__main__':
    cli()
Run Code Online (Sandbox Code Playgroud)

双方clifoo可能会提高。我知道,一个可能的解决方案是将try-except各地cli()的在if条款。但是当你分发一个包时这不起作用。在setup.py 中,您必须指定一个入口点(在本例中为cli)。该if条款将不会被执行。

Ste*_*uch 6

您可以click.Group通过继承来创建自定义。自定义组可以通过将其作为cls参数传递给click.group()装饰器来使用。如果您覆盖该__call__方法,您可以插入一个异常处理程序,如:

代码:

class CatchAllExceptions(click.Group):

    def __call__(self, *args, **kwargs):
        try:
            return self.main(*args, **kwargs)
        except Exception as exc:
            click.echo('We found %s' % exc)
Run Code Online (Sandbox Code Playgroud)

测试代码:

import click

@click.group(cls=CatchAllExceptions)
def cli():
    pass

@cli.command()
def foo():
    raise Exception('an exception!')

if __name__ == '__main__':
    cli('foo'.split())
Run Code Online (Sandbox Code Playgroud)

结果:

We found an exception!
Run Code Online (Sandbox Code Playgroud)