首页 > 解决方案 > picocli 异常行为改变了吗?

问题描述

我正在从 picocli 3.9.6 更新到 4.2.0,在用新版本替换旧的不推荐使用的调用时遇到了问题。

在我的原始版本中,我有一个这样的代码块:

try {
    return commandLine.parseWithHandlers(
            new RunLast().useOut(ps),
            new ExceptionHandler(),
            args);
}
catch(Exception e) {
    // handle exceptions
}

ExceptionHandler处理参数和执行异常——两者都被重新抛出,但参数异常将帮助文本添加到异常文本中。在某些情况下,例如,一个命令被赋予了错误的参数,catch 就会被击中。catch 将确保在 UI 中打印错误。

我试图像这样更新它:

try {
    commandLine.setOut(pw);
    ExceptionHandler handler = new ExceptionHandler();
    commandLine.setExecutionExceptionHandler(handler);
    commandLine.setParameterExceptionHandler(handler);
    commandLine.execute(args);
    return commandLine.getExecutionResult();
}
catch(Exception e) {
    // handle exceptions
}

在这个新版本中,异常会像以前一样被抛出,但在被ExceptionHandler. 我怎样才能捕捉到这些异常?

标签: javapicocli

解决方案


picocli 4.x 的变化之一是新的执行框架。用户手册有一个关于迁移的部分可能有用。

按照设计,该CommandLine::execute方法永远不会引发异常。所以没有必要CommandLine::execute用一个try/catch块来包围对的调用(除非你需要捕获一个Erroror Throwable)。

相反,您可以选择指定自定义异常处理程序,就像您在示例中所做的那样。这些异常处理程序是您可以向用户显示错误消息的地方。(可能是先前 ExceptionHandler 中的内容和先前在catch块中的逻辑的组合。)

ParameterExceptionHandler用户提供无效输入时调用。默认处理程序显示一条错误消息,可能会为看起来像错字的选项或子命令建议替代拼写,最后显示使用帮助消息。用户手册的“处理错误”部分有一个示例ShortErrorMessageHandler,当使用帮助消息太长以至于掩盖了错误消息时,该示例可能很有用。

ExecutionExceptionHandler业务逻辑抛出异常时调用。默认处理程序只是重新抛出异常,这会导致打印堆栈跟踪。用户手册的业务逻辑异常部分显示了另一种选择。

听起来您需要一个自定义ExecutionExceptionHandler来打印堆栈跟踪,然后是使用帮助消息。


推荐阅读