Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数内部的exit()调用,该函数应返回引用_C++_Reference_Return_Exit - Fatal编程技术网

C++ 函数内部的exit()调用,该函数应返回引用

C++ 函数内部的exit()调用,该函数应返回引用,c++,reference,return,exit,C++,Reference,Return,Exit,在一个库中,我有一个函数,它在数据库中搜索一个键,并返回一个对象的非常量引用。我想处理找不到键的情况,这通常是由于调用函数时出错造成的。这种情况非常糟糕,程序无法继续,因此我打印了一条消息以帮助发现错误并调用exit(1)。问题在于return语句,在这种情况下它永远不会执行,但无论如何都必须存在。如果是指针,我可以返回nullptr但是有引用吗?我是否应该执行类似于此伪代码的操作 Type & get(const Key & k) { if (my_db.key_e

在一个库中,我有一个函数,它在数据库中搜索一个键,并返回一个对象的非常量引用。我想处理找不到键的情况,这通常是由于调用函数时出错造成的。这种情况非常糟糕,程序无法继续,因此我打印了一条消息以帮助发现错误并调用
exit(1)
。问题在于return语句,在这种情况下它永远不会执行,但无论如何都必须存在。如果是指针,我可以
返回nullptr但是有引用吗?我是否应该执行类似于此伪代码的操作

 Type & get(const Key & k) {
     if (my_db.key_exists(k)) {
       return my_db.at(k);
     }
     std::cerr << k << " not found\n";
     exit(1); 
     return *(new Type(some_dummy_parameters));
 }
Type&get(常量键&k){
如果(我的数据库密钥存在(k)){
在(k)处返回我的数据库;
}

std::cerr库不应退出hostest应用程序

使用“return null”,进入“不一致状态”,每次呼叫都返回null。
图书馆用户将不得不处理它


或例外…

例外

这是许多程序中的常见情况。为了克服这一问题,使用了异常

  • 为了处理意外情况,将创建新的异常并从代码中“抛出”
  • 然后它们必须被调用函数的程序“捕获”
您可以阅读有关异常的更多信息

希望这有帮助

这种情况非常糟糕,程序无法继续,因此我打印了一条消息以帮助发现错误并调用exit(1)

否。如果此代码是库的一部分,则库不应是决定应用程序是否应退出的库

如果文件已打开并需要关闭,或者需要清理其他资源,或者DB类的用户希望记录错误并继续执行其他操作,该怎么办

答案不是你现在正在做什么。抛出一个异常,返回一个错误代码,等等。但是不要在库或类代码中关闭应用程序


信不信由你,有一个商业数据库库确实做了你正在做的事情(关闭应用程序)。他们的数据库用户对他们为什么意外关闭应用程序做出了很多愤怒的反应。你知道吗?给客户的答案是“我们觉得错误严重到足以停止应用程序,因为我们的库无法继续正常工作”。这不仅是错误的推理,而且近乎傲慢,客户会让他们知道这一点。

正如其他受访者所说,答案应该是:抛出异常

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);
}
Type&get(常量键&k){
如果(!my_db.key_存在(k)){
std::stringstream错误;

错误我可以抛出一个异常,但我不能强制用户捕获它。如果出于任何原因他没有捕获,这将成为一个核心转储。这比调用exit()好吗?如果你清楚地记录了从你的函数中抛出的异常,并且用户拒绝阅读这些文档并且没有尝试/捕获,那么如果他们的程序崩溃,那就是他们的问题,而不是你的问题。我喜欢这个答案,个人经验和轶事让你比人们告诉你“做这个做那个”更有道理!您不需要return语句,因为您永远不会到达函数的结尾。(但是,某些编译器可能会发出警告。)@JamesKanze是的,这一切都是为了避免编译器警告。但是由于收到了大量的建议,我现在正在考虑使用异常。即使它们没有被发现导致内核转储,它们看起来仍然是退出函数的更好方法。@DarioP我不反对关于这一点的其他评论。我倾向于避免
exit
com完全在C++中(因为它不调用任何局部变量的析构函数),并将错误传播到我可以返回的
main
。您可能应该使用异常,正如答案所示。但是,从技术角度来看,您可以通过颠倒测试的意义来解决手头的问题。在if语句中使用
!my_db.key_exists(k)