exit() 在应该返回引用的函数内调用
exit() call inside a function which should return a reference
在一个库中,我有一个函数,它搜索数据库中的键并返回对对象的非常量引用。我想处理找不到键的情况,这通常是由调用函数时的错误引起的。这种情况非常糟糕,程序无法继续,因此我打印了一条消息以帮助发现错误并调用exit(1)
。问题在于 return 语句,在这种情况下永远不会执行,但无论如何都必须在那里。如果它是一个指针,我可以return nullptr;
但有参考?我应该做类似这个伪代码的事情吗?
Type & get(const Key & k) {
if (my_db.key_exists(k)) {
return my_db.at(k);
}
std::cerr << k << " not foundn";
exit(1);
return *(new Type(some_dummy_parameters));
}
看起来太可怕了!也许我应该避免这样的功能。请让我知道您的意见!
这种情况非常糟糕,程序无法继续,所以我打印了一条消息来帮助发现错误并调用 exit(1)
不。 如果此代码是库的一部分,则库不应是决定应用程序是否应退出的库。
如果文件已打开并需要关闭,或者需要清理其他资源,或者数据库类的用户想要记录错误并继续执行其他操作,该怎么办?
答案绝不是你现在正在做的事情。 抛出异常,返回错误代码等。 但不要在库或类代码中关闭应用程序。
信不信由你,有一个商业数据库库完全按照你正在做的事情(关闭应用程序)。 他们从图书馆的用户那里得到了很多愤怒的回应,为什么他们意外关闭了应用程序。 你知道吗 - 给客户的答案是"我们认为错误严重到足以停止应用程序,因为我们的库无法继续正常工作"。 这不仅是糟糕的推理,而且近乎傲慢,客户让他们知道这一点。
异常
这是许多程序中的常见情况。为了克服这个问题,使用了异常。
- 为了处理意外情况,将创建新的异常并从代码中"抛出"。
- 然后它们必须被调用函数的程序"捕获"。
您可以在此处阅读有关例外的更多信息。
希望这有帮助。
正如其他受访者所说,答案应该是:抛出一个异常......
Type & get(const Key & k) {
if( !my_db.key_exists(k) ) {
std::stringstream error;
error << "key " << k << " not found";
throw std::runtime_error(error);
}
return my_db.at(k);
}
库不应退出最托管的应用程序。
使用"返回 NULL",进入"不一致状态",在每次调用中都返回 NULL。
库用户必须处理它。
或例外...
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 无法将右值引用函数与 GCC 匹配
- C ++引用函数参数似乎包含原始对象的副本,而不是充当"real reference"
- 通过引用函数传递指针参数是什么意思?
- 常量引用函数参数的地址何时唯一?
- 我想了解为什么在这个例子中使用引用函数?或者引用在c++函数中的重要性
- C++ 通过引用函数传递数组,但内容保持不变
- 用数组或指针引用函数?
- 引用函数如何"int &foo();"工作?
- 常量引用函数参数:是否可以禁止临时对象?
- 计算在代码中引用函数的次数
- <initializer_list> 引用函数
- 字符串引用(函数)的差异
- 在类中引用函数时的"No Matching Function for Call"
- 无法通过引用函数"calcValues"中"firstNum"和"secondNum"变量来更改值
- 尝试引用已删除的函数(不引用函数)
- 引用函数指针
- 引用函数按值和自动返回
- 为什么我们可以取消引用函数指针
- 通过引用函数传递值的目的是什么