python click subcommand unified error handling

No caso em que existem grupos de comando e cada subcomando pode gerar exceções, como posso lidar com todos eles juntos em um só lugar?

Dado o exemplo abaixo:

import click @click.group() def cli(): pass @cli.command() def foo(): pass if __name__ == '__main__': cli() 

Ambos cli e foo podem aumentar. Eu sei que uma solução possível é colocar try-except torno de cli() na cláusula if . Mas isso não funciona quando você distribui um pacote. Em setup.py , você precisa especificar um ponto de input (neste caso, cli ). A cláusula if não será executada.

Você pode criar um click.Group personalizado.Grupo, herdando o mesmo. O grupo personalizado pode ser usado passando-o como o parâmetro cls para o decorador click.group() . Se você replace o método __call__ , poderá inserir um manipulador de exceções como:

Código:

 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) 

Código de teste:

 import click @click.group(cls=CatchAllExceptions) def cli(): pass @cli.command() def foo(): raise Exception('an exception!') if __name__ == '__main__': cli('foo'.split()) 

Resultados:

 We found an exception!