5

在有命令组并且每个子命令都可能引发异常的情况下,我怎样才能在一个地方一起处理它们?

给出下面的例子:

import click


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

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

if __name__ == '__main__':
    cli()

两者都cli可以foo加注。我知道一种可能的解决方案是放在try-except从句中cli()if但是,当您分发包时,这不起作用。在setup.py中,您必须指定一个入口点(在本例中为cli)。该if子句不会被执行。

4

1 回答 1

7

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)

测试代码:

import click

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

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

if __name__ == '__main__':
    cli('foo'.split())

结果:

We found an exception!
于 2017-06-03T19:24:19.113 回答