如何处理picocli中的错误?

时间:2019-02-06 00:09:57

标签: java kotlin picocli

我尝试实现自己的CLI,并希望使用picocli来解析命令的参数。这就是为什么我根本不希望picocli在控制台中编写的原因。因此,我创建了带有某些选项和参数注释的类MyCommand。现在,我希望能够执行以下操作:

val myCommand = CommandLine.populateCommand(MyCommand(), args)
myCommand.execute();
val output = myCommand.getOutput();
val errors: List<String> = myCommand.getErrors();

前三行没有问题,但是我不确定如何处理第四行。现在populateCommand仅抛出所有异常,而捕获它们不是一个选择,因为抛出的异常将停止我的管道计算。 Picocli文档建议使用解析器宽松模式将异常存储在ParseResult中,但这意味着我必须使用commandLine.parseWithHandlers方法,这种方法很难满足我的需求。
我想念什么吗?也许我仍然可以使用populateCommand并将异常存储在某个地方?
这是populateCommand引发的异常之一的堆栈跟踪:

Exception in thread "main" picocli.CommandLine$MissingParameterException: Missing required parameter for option '-A' (<afterContext>)
    at picocli.CommandLine$Interpreter.assertNoMissingParameters(CommandLine.java:8059)
    at picocli.CommandLine$Interpreter.applyOption(CommandLine.java:7534)
    at picocli.CommandLine$Interpreter.processStandaloneOption(CommandLine.java:7446)
    at picocli.CommandLine$Interpreter.processArguments(CommandLine.java:7355)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7226)
    at picocli.CommandLine$Interpreter.parse(CommandLine.java:7116)
    at picocli.CommandLine.parse(CommandLine.java:824)
    at picocli.CommandLine.populateCommand(CommandLine.java:777)

1 个答案:

答案 0 :(得分:1)

  

忽略解析错误是不常见的,但在创建时会很有用   您自己的 interactive CLI控制台,而不是单个命令。我的答案假设这就是您的想法。

一个想法是使用parseArgs方法而不是populateCommand方法。如果您已将解析器配置为宽松的,则此方法将返回ParseResult,从中您可以获取picocli在解析过程中遇到的错误。

例如:

val myCommand = MyCommand();
val commandLine = CommandLine(myCommand);

// tell parser to be lenient 
commandLine.getCommandSpec().parser().collectErrors(true);

// parse user input, query result for errors 
val parseResult = commandLine.parseArgs(args); 
val parseErrors: List<Exception> = parseResult.errors();

// ignoring the errors for now...
myCommand.execute();
val output = myCommand.getOutput();
val appErrors: List<String> = myCommand.getErrors();
  

请注意,如果存在 个解析错误,则表示用户   指定的无效输入。结果,您的命令可能没有被执行   正确初始化。 execute方法必须特别健壮   处理部分初始化的选项/位置参数。

提示:如果要创建自己的 interactive CLI控制台(而不是单个命令),则可能对JLine 2(需要Java 5或更高版本)或{{ 3}}(需要Java 8或更高版本)。 Picocli提供了JLine 3picocli-shell-jline2模块,这些模块具有PicocliJLineCompleter,这些模块显示了picocli命令的上下文相关完成候选。 (每个模块的自述文件都有一个示例。)使用picocli定义其命令的应用程序不再需要为其命令和选项手动编写“完成程序”。 (picocli-shell-jline3中使用了此版本的早期版本。)