Я пытаюсь найти лучший способ чистого выхода из моей программы после распечатки справочной информации 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», что мне сделать, чтобы выйти из моей программы?
Должна ли моя функция не возвращать std :: string и просто возвращать код ошибки?
Должен ли я выбросить исключение и поймать его в главном, а затем выйти?
Есть ли намного более хороший / лучший способ сделать это?
Заранее спасибо.
Еще один лучший способ на мой взгляд, согласно этому посту: 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 во всей его целостности.
Вот мое личное мнение: нет лучшего способа практики, но я предпочитаю первый подход!
1. Подход:
https://en.cppreference.com/w/cpp/utility/program/exit
Вы можете вызвать следующую функцию:
std::exit( EXIT_FAILURE );
2. Подход:
Создать исключение.
throw "Please call me with some parameters!"
Но я не предпочитаю такой подход. Для некоторых пользователей исключение выглядит как внутренняя программная ошибка …