从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?
How should I exit a C++ program cleanly after printing the CLI help message from a function?
我正在尝试找出在程序中打印 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 "帮助"消息后,我该怎么做才能退出我的程序?
我的函数不应该返回 std::string 而只返回错误代码吗?
我应该抛出一个异常并在 main 中捕获它然后退出吗?
有没有更好/更好的方法?
提前谢谢。
根据这篇文章,我认为另一种更好的方法: 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])的第一个参数等于"-h"或"--help">,则返回true,如果不是checkHelp返回false。您还可以对 main 收到的所有 argv 参数执行循环。
3)最后,catch (std::exception const &err)
允许您通过引用获取抛出的异常并打印他的消息。所以,你正在用你所有的诚信来尝试/捕捉块。
这是我个人的观点:没有最佳实践方法,但我更喜欢第一种方法!
1. 方法:
https://en.cppreference.com/w/cpp/utility/program/exit
您可以调用以下函数:
std::exit( EXIT_FAILURE );
2. 方法:
创建异常。
throw "Please call me with some parameters!"
但我不喜欢这种方法。对于某些用户,异常看起来像是存在内部软件错误...
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- Eigen如何在容器循环中干净地附加矩阵
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 如何让LLDB在成功时退出,在失败时等待
- C++控制台应用程序阻止退出
- Python中的for循环与C++有何不同
- 程序在执行程序的其余部分之前退出
- 构造函数在退出函数时无法初始化一个参数
- 为什么异常不退出程序?
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- 退出简单while循环时出现问题
- 使用vscode调试时,GDB意外退出
- 在C++中迭代 2D 容器的最干净方法
- pclose() 不会给我进程退出代码
- 从函数打印 CLI 帮助消息后,我应该如何干净地退出 C++ 程序?
- 使用goto来干净地退出循环
- 如何从使用Poco::Net::TCPServer的程序中干净地退出
- 我的 switch 语句没有干净地退出循环