python单击子命令统一错误处理

时间:2017-06-03 14:26:52

标签: python python-click

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

鉴于以下示例:

import click


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

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

if __name__ == '__main__':
    cli()

clifoo都可能会提升。我知道一种可能的解决方案是在try-except子句中cli()周围放置if。但是,当您分发包时,这不起作用。在 setup.py 中,您必须指定一个入口点(在本例中为cli)。 <{1}}子句不会被执行。

1 个答案:

答案 0 :(得分:4)

您可以通过继承自定义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!

结果:

if(isset($_POST['productNames']) & isset($_POST['productCode']) & isset($_POST['barcode']) & isset($_POST['starterAmount']) & isset($_POST['buyingFee']) & isset($_POST['sellingFee']) & isset($_POST['KDV']))