gpt4 book ai didi

java - picocli 异常行为改变了吗?

转载 作者:行者123 更新时间:2023-12-02 07:57:21 24 4
gpt4 key购买 nike

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

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

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

ExceptionHandler 处理参数异常和执行异常——两者都会被重新抛出,但参数异常会将帮助文本添加到异常文本中。在某些情况下,例如,命令被赋予错误的参数,捕获就会被命中。该捕获将确保错误打印在 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 block 捕获。我怎样才能捕获这些异常?

最佳答案

picocli 4.x 中的更改之一是新的 execution框架。用户手册有section on migration这可能有用。

根据设计,CommandLine::execute 方法永远不会引发异常。因此,无需使用 try/catch block 来包围对 CommandLine::execute 的调用(除非您需要捕获 Error可抛出)。

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

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

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

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

关于java - picocli 异常行为改变了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61001974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com