2017-08-25 125 views
1

Click的exception handling documentation提到某些类型的例外,如AbortEOFErrorKeyboardInterrupt会被框架自动正确处理。有没有办法用Python单击自动处理异常?

对于我正在编写的应用程序,有很多可以生成异常的点。终止应用程序是正确的步骤,但打印堆栈跟踪不是。我总是可以手动执行此操作:

@cli.command() 
def somecommand: 
    try: 
    # ... 
    except Exception as e: 
    click.echo(e) 

但是,有没有办法让Click自动处理所有异常?

回答

1

在我们的CLI中,所有命令都归入一个命令组。这使我们能够执行一些需要为每个命令执行的行为。其中一部分是异常处理。

我们的切入点看起来是这样的:

@click.group() 
@click.pass_context 
def entry_point(ctx): 
     ctx.obj = {"example": "This could be the configuration"} 

我们用它来运行的全局代码,例如配置context,但您也可以定义一个不执行任何操作的空方法。其他命令可以通过使用@entry_point.command()装饰器或entry_point.add_command(cmd)添加到此命令组。

对于异常处理,我们在处理例外的另一种方法包裹entry_point

def safe_entry_point(): 
     try: 
      entry_point() 
     except Exception as e: 
      click.echo(e) 

setup.py,我们配置的入口点的CLI并将其指向包装:

entry_points={ 
    'console_scripts': [ 
     'cli = my.package:safe_entry_point' 
    ] 
} 

CLI的命令可以通过其命令组执行:例如cli command

可能有更优雅的解决方案,但这是我们如何解决它。虽然它引入了一个命令组作为CLI中的最高级别元素,但它允许我们在单个位置处理所有异常,而无需在每个命令中重复我们的错误处理。

相关问题