Как я могу обработать ошибки в picocli? - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь реализовать свой собственный 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 голосов
/ 07 февраля 2019

Игнорирование ошибок синтаксического анализа является необычным, но может быть полезно при создании вашей собственной интерактивной консоли 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 должен быть более устойчивым, чтобы иметь дело с частично инициализированными опциями / позиционными параметрами.

СОВЕТ: Если вы создаете свою собственную интерактивную консоль CLI (в отличие отодна команда), вас могут заинтересовать JLine 2 (требуется Java 5 или выше) или JLine 3 (требуется Java 8 или выше).Picocli предоставляет модули picocli-shell-jline2 и picocli-shell-jline3 , которые имеют PicocliJLineCompleter, который показывает контекстно-зависимые кандидаты на завершение для команд picocli.(В файле readme каждого модуля есть пример.) Приложения, использующие picocli для определения своих команд, больше не нуждаются в ручном кодировании Completers для своих команд и опций.(Ранняя версия этого используется в Micronaut CLI .)

...