Пикокли исключение поведение изменилось? - PullRequest
3 голосов
/ 03 апреля 2020

Я выполняю обновление с 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 гарантировала бы, что ошибка была напечатана в интерфейсе пользователя.

Я попытался обновить ее следующим образом:

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. Как я могу поймать эти исключения?

1 Ответ

0 голосов
/ 03 апреля 2020

Одним из изменений в picocli 4.x является новый исполняемый фреймворк . В руководстве пользователя есть раздел по миграции , который может быть полезен.

В принципе метод CommandLine::execute никогда не вызывает исключение. Поэтому нет необходимости окружать вызов CommandLine::execute блоком try/catch (если только вам не нужно перехватывать Error или Throwable).

Вместо этого вы можете по желанию указать пользовательские обработчики исключений Как вы уже сделали в своем примере. В этих обработчиках исключений вы можете показывать пользователям сообщение об ошибке. (Возможно, сочетание того, что было в предыдущем ExceptionHandler, и логики c, которая ранее была в блоке catch.)

ParameterExceptionHandler вызывается, когда пользователь предоставил неверный ввод. Обработчик по умолчанию показывает сообщение об ошибке, может предлагать альтернативные варианты написания опций или подкоманд, которые выглядят как опечатка, и, наконец, отображает сообщение об использовании. В разделе Обработка ошибок в руководстве пользователя приведен пример ShortErrorMessageHandler, который может быть полезен, когда сообщение справки об использовании настолько длинное, что скрывает сообщение об ошибке.

ExecutionExceptionHandler вызывается, когда бизнес-логика c выдает исключение. Обработчик по умолчанию просто сбрасывает исключение, что приводит к печати трассировки стека. В разделе Business Logi c Exceptions в руководстве пользователя представлен альтернативный вариант.

Похоже, вам нужен пользовательский ExecutionExceptionHandler, который печатает трассировку стека с последующим сообщением помощи использования.

...