异常处理

单击内部使用异常来表示应用程序用户可能导致的各种错误情况。主要是不正确的用法。

哪里处理错误?

Click的主要错误处理发生在 BaseCommand.main() . 在这里,它处理所有子类 ClickException 以及标准 EOFErrorKeyboardInterrupt 例外情况。后者内部转换为 Abort .

应用的逻辑如下:

  1. 如果一个 EOFErrorKeyboardInterrupt 发生了,重估为 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)

哪些例外情况存在?

单击有两个异常基: ClickException 对于单击希望向用户发出信号的所有异常,将引发 Abort 用于指示单击中止执行。

A ClickException 有一个 show() 方法,它可以将错误消息呈现给stderr或给定的文件对象。如果您想自己使用这个异常来做一些事情,请检查API文档,了解它们还提供了什么。

存在以下常见子类:

  • UsageError 通知用户出了问题。

  • BadParameter 通知用户某个特定参数出了问题。这些通常在内部通过单击进行处理,如果可能,还可以添加额外的信息。例如,如果这些都是从回调中引发的,那么如果可能的话,单击将自动用参数名对其进行扩充。

  • FileError 这是由 FileType 如果单击在打开文件时遇到问题。