异常处理

Click内部使用异常提示来表示应用程序的用户设置的各种错误条件。这是使用不当所造成的。

错误在哪里处理?

Click的主要错误处理发生在 BaseCommand.main(). 在那里它处理所有的子类 ClickException 以及 EOFErrorKeyboardInterrupt 标准。后者在内部翻译成一个 Abort.

应用的逻辑如下:

  1. 如果 EOFError 或者 KeyboardInterrupt 发生,,将其重新评估为 Abort.
  2. 如果出现一个 ClickException , 调用 ClickException.show() 方法来显示它,然后退出程序 ClickException.exit_code.
  3. 如果发生 Abort 异常,则将字符串打印Aborted! 到标准错误,并使用退出代码退出程序1。
  4. 如果顺利通过,退出程序退出代码0。

如果我不想要呢?

一般来说,你总是可以选择自己调用 invoke() 方法。例如,如果你有一个

Command 你可以像这样手动调用它:

ctx = command.make_context('command-name', ['args', 'go', 'here'])
with ctx:
    result = command.invoke(ctx)

在这种情况下,异常将不会被完全处理,并且会像你期望的那样冒出来。

从Click 3.0开始,你也可以使用该 Command.main() 方法,但禁用独立模式将执行两项操作:禁用异常处理并在最后通过 sys.exit() 禁用隐式模式。

所以你可以这样做::

command.main(['command-name', 'args', 'go', 'here'],
             standalone_mode=False)

存在哪些例外?

Click 具有两个异常基础: ClickException 针对所有例外情况引发的Click,这些异常是要向用户发出信号,而 Abort 用于指示Click的中止执行。

ClickException 有一个 show() 方法可以将错误消息呈现给stderr或给定的文件对象。如果你想自己使用这个异常做一些检查他们提供的API文档。

以下常见存在的子类:

  • UsageError 通知用户出了问题。
  • BadParameter 通知用户特定参数出现问题。这些通常在Click处理内部处理,如果可能的话,增加额外的信息。例如,如果这些是从回调引发Click,将自动增加它的参数名称。
  • FileError 这是一个错误, FileType Click遇到打开文件问题时会出现