Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python单击子命令统一错误处理_Python_Python Click - Fatal编程技术网

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

python单击子命令统一错误处理,python,python-click,Python,Python Click,如果存在命令组,并且每个子命令都可能引发异常,那么如何在一个地方一起处理它们 给出以下示例: import click @click.group() def cli(): pass @cli.command() def foo(): pass if __name__ == '__main__': cli() cli和foo都可能引发。我知道一个可能的解决方案是在if子句中的cli()周围放置try except。但是,当您分发包时,这不起作用。在setup.py

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

给出以下示例:

import click


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

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

if __name__ == '__main__':
    cli()

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

您可以通过从相同的组继承来创建自定义的
单击.Group
。通过将自定义组作为
cls
参数传递给
click.group()
decorator,可以使用该自定义组。如果重写
\uuuuuuuuuuuuuuuu调用
方法,则可以插入异常处理程序,如:

代码: 测试代码: 结果:
是否可以访问异常处理程序中的上下文?@masi,很可能。但你应该问一个新问题。你应该把一个例子放在一起,说明你希望它如何工作。我们已经这么做了,但我从来都不清楚你到底在追求什么。如果需要,你可以在这里写个便条,如果你想确定我看到了问题。
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!