java - 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
. 我怎样才能捕捉到这些异常?
解决方案
picocli 4.x 的变化之一是新的执行框架。用户手册有一个关于迁移的部分可能有用。
按照设计,该CommandLine::execute
方法永远不会引发异常。所以没有必要CommandLine::execute
用一个try/catch
块来包围对的调用(除非你需要捕获一个Error
or Throwable
)。
相反,您可以选择指定自定义异常处理程序,就像您在示例中所做的那样。这些异常处理程序是您可以向用户显示错误消息的地方。(可能是先前 ExceptionHandler 中的内容和先前在catch
块中的逻辑的组合。)
当ParameterExceptionHandler
用户提供无效输入时调用。默认处理程序显示一条错误消息,可能会为看起来像错字的选项或子命令建议替代拼写,最后显示使用帮助消息。用户手册的“处理错误”部分有一个示例ShortErrorMessageHandler
,当使用帮助消息太长以至于掩盖了错误消息时,该示例可能很有用。
当ExecutionExceptionHandler
业务逻辑抛出异常时调用。默认处理程序只是重新抛出异常,这会导致打印堆栈跟踪。用户手册的业务逻辑异常部分显示了另一种选择。
听起来您需要一个自定义ExecutionExceptionHandler
来打印堆栈跟踪,然后是使用帮助消息。
推荐阅读
- node.js - 如何更改计时器的值
- python - pytest 代码和路由的实际烧瓶会话之间的行为差异
- python - 尝试创建一个函数来搜索字符串中的单词
- ios - geocodeAddressString(String:) 上的 iOS 完成处理程序不执行语句
- firebase - 尝试更新flutter firebase中的数据时出错 - 未处理的异常:无效参数:'TextEditingController'的实例
- linux - USB 音频输入设备未列为“arecord -l”下的输入设备
- node.js - 如何从 Node.js 中的 JSON 文件中检索特定数据集?
- android - 所有代码均未在 SkuDetailsResponseListener 内执行
- json - JSON 中不可读的文本
- python - 当我要求它只接受整数和浮点数时,为什么我在 python 中的验证尝试接受字母?