исключение — Как мне правильно выйти из программы на C ++ после печати справочного сообщения CLI из функции?

Я пытаюсь найти лучший способ чистого выхода из моей программы после распечатки справочной информации CLI в моей программе. В настоящее время это выглядит так.

int main(int argc, *char[] argv) {
try {
std::string settings_file = process_args(argc, argv);

do_more_stuff();
...
...
} catch (...) {
std::cerr << "Error" << std::endl;
return (EXIT_FAILURE)
}
}

std::string process_args(int argc, char *argv[]) {
boost::program_options::options_description desc("Program options");
desc.add_options()("help,h", "Print usage message")(
"settings,s", boost::program_options::value<std::string>(),
"Specify settings file");

boost::program_options::variables_map vm;

store(parse_command_line(argc, argv, desc), vm);

if (vm.count("help")) {
std::cout << desc << std::endl;
---->!!!!!!!! WHAT DO I DO HERE TO GET OUT !!!!!!!!<----
}
if (vm.count("settings")) {
std::cout << "Settings file " << vm["settings"].as<std::string() << std::endl;
return vm["settings"].as<std::string>();
} else {
throw std::runtime_error("Settings file must be specified.");
}
}

Таким образом, мой вопрос заключается в том, что после того, как я напечатал сообщение CLI «help», что мне сделать, чтобы выйти из моей программы?

  1. Должна ли моя функция не возвращать std :: string и просто возвращать код ошибки?

  2. Должен ли я выбросить исключение и поймать его в главном, а затем выйти?

  3. Есть ли намного более хороший / лучший способ сделать это?

Заранее спасибо.

0

Решение

Еще один лучший способ на мой взгляд, согласно этому посту: C ++ ловит все исключения

#include <cstdlib>
#include <iostream>
#include <stdexcept>

static bool checkHelp(char * const argv[])
{
bool usage = (!strcmp(argv[1], "-h") or !strcmp(argv[1], "--help"));

if (usage) {
std::cout << "Print your usage" << std::endl;
}
return usage;
}

int main(int argc, char *argv[])
{
/* Set eval to default value */
int eval = EXIT_SUCCESS;

try {
if (!checkHelp(argv)) {
/*
** do some stuff here
*/
}
} catch (std::exception const &err) {
/* update eval on throwed exceptions */
eval = EXIT_FAILURE;
std::cerr << "error: " << err.what() << std::endl;
}
return eval;
}

Делая так, вы можете управлять всем выполнением вашей программы в контексте ошибки и выбирать, что делать: обновлять возвращаемое значение, делать другие вещи и т. Д.
Вы не нарушаете основной поток и не допускаете ошибок / утечек памяти без выхода exit() функция.

1) Eval (для ‘выходного значения’) создается и уничтожается основной контекст. В соответствии с типом возвращаемого значения main, мы должны изменить его значение, если произошла ошибка, прежде чем возвращать его при выходе из программы.

2) В моем примере я отправляю argv в функцию checkHelp, которая вернула правда если первый аргумент моего программного обеспечения (ARGV [1] здесь) равно «-час» или же «—Помогите», если не checkHelp возвращается ложный. Вы также можете выполнить цикл для всех аргументов argv, полученных main.

3) В заключение, catch (std::exception const &err) позволяет получить выброшенное исключение по ссылке и распечатать его сообщение. Итак, вы используете свой основной блок try / catch во всей его целостности.

0

Другие решения

Вот мое личное мнение: нет лучшего способа практики, но я предпочитаю первый подход!

1. Подход:
https://en.cppreference.com/w/cpp/utility/program/exit

Вы можете вызвать следующую функцию:

std::exit( EXIT_FAILURE );

2. Подход:
Создать исключение.

throw "Please call me with some parameters!"

Но я не предпочитаю такой подход. Для некоторых пользователей исключение выглядит как внутренняя программная ошибка …

-1

По вопросам рекламы [email protected]