首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理picocli中的错误?

如何处理picocli中的错误?
EN

Stack Overflow用户
提问于 2019-02-06 00:09:57
回答 1查看 1.7K关注 0票数 3

我尝试实现自己的CLI,并希望使用picocli来解析命令的参数。这就是为什么我根本不希望picocli在控制台上写。因此,我创建了带有一些选项和参数注释的类MyCommand。现在我想做这样的事情:

代码语言:javascript
复制
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抛出的异常之一的堆栈跟踪:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-06 23:24:18

忽略解析错误是不寻常的,但是在创建您自己的交互式CLI控制台(而不是单个命令)时会很有用。我的回答假设这就是你想要的。

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

例如:

代码语言:javascript
复制
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方法需要具有额外的鲁棒性,以处理部分初始化的选项/位置参数。

提示:如果您正在创建自己的交互式CLI控制台(与单个命令相反),您可能对JLine 2 (需要Java5或更高版本)或JLine 3 (需要Java8或更高版本)感兴趣。Picocli提供了picocli-shell-jline2 2picocli-shell-jline3 3模块,这些模块具有一个PicocliJLineCompleter,该模块可以显示针对picocli命令的上下文敏感的完成选择。(每个模块的自述文件都有一个示例。)使用picocli定义命令的应用程序不再需要为命令和选项编写Completer代码。(在微型CLI中使用的是早期版本。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54544936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档