我正在从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块捕获。如何捕获这些异常?
发布于 2020-04-03 10:22:14
picocli 4.x中的一个变化是新的execution框架。用户手册中有一个可能有用的section on migration。
根据设计,CommandLine::execute方法从不抛出异常。因此,没有必要使用try/catch块来包围对CommandLine::execute的调用(除非需要捕获Error或Throwable)。
相反,您可以有选择地指定自定义异常处理程序,就像您在示例中所做的那样。在这些异常处理程序中,您可以向用户显示错误消息。(可能是前一个ExceptionHandler中的内容和之前catch块中的逻辑的组合。)
当用户提供无效输入时,将调用ParameterExceptionHandler。默认处理程序显示一条错误消息,可能会为看起来像打字错误的选项或子命令建议替代拼写,最后显示用法帮助消息。用户手册的Handling Errors部分有一个示例ShortErrorMessageHandler,当使用帮助消息太长而使错误消息变得模糊时,该示例可能会很有用。
当业务逻辑抛出异常时,将调用ExecutionExceptionHandler。默认处理程序只是重新抛出异常,这会导致打印堆栈跟踪。用户手册的Business Logic Exceptions部分显示了另一种选择。
听起来您需要一个自定义ExecutionExceptionHandler来打印堆栈跟踪,后跟用法帮助消息。
https://stackoverflow.com/questions/61001974
复制相似问题