【问题标题】:picocli exception behavior changed?picocli 异常行为改变了吗?
【发布时间】:2020-07-15 00:54:35
【问题描述】:

我正在从 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 重新抛出后,它们不再被 catch 块捕获。如何捕获这些异常?

【问题讨论】:

  • 看来我现在应该通过退出代码而不是异常来执行此操作。或者也许我不需要自定义异常处理程序来将帮助文本添加到执行结果中?

标签: java picocli


【解决方案1】:

picocli 4.x 的变化之一是新的execution 框架。用户手册有一个section on migration 可能有用。

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

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

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

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

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

【讨论】:

  • 我正在尝试使用默认的ParameterExceptionHandler,但它似乎没有打印到我通过CommandLine.setOut(PrintWriter) 提供的PrintWriter - 它只是出现在std err 中。有什么想法吗?
  • 我想通了。我不得不使用CommandLine.setErr(PrintWriter)
猜你喜欢
  • 2011-02-13
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 2022-04-13
  • 2011-09-15
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多