2017-08-25 121 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中的最高級別元素,但它允許我們在單個位置處理所有異常,而無需在每個命令中重複我們的錯誤處理。

相關問題