exit()调用一个应该返回引用的函数

时间:2014-04-03 16:09:19

标签: c++ reference return exit

在库中,我有一个函数,它在数据库中搜索键并返回对象的非const引用。我想处理找不到密钥的情况,这通常是由调用函数时的错误引起的。这种情况太糟糕了,程序无法继续,因此我打印一条消息以帮助发现错误并致电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 found\n";
     exit(1); 
     return *(new Type(some_dummy_parameters));
 }

看起来太可怕了!也许我应该避免这样的功能。请让我知道你的意见!

4 个答案:

答案 0 :(得分:9)

  

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

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

如果文件是打开的并且需要关闭,或者需要清理某些其他资源,或者数据库类的用户想要记录错误并继续执行其他操作,该怎么办?

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

信不信由你,有一个商业数据库库可以完成你正在做的事情(关闭应用程序)。他们从图书馆的用户那里得到了很多愤怒的回应,他们为什么要意外关闭应用程序。而且你知道什么 - 给客户的答案是“我们认为错误严重到足以阻止应用程序,因为我们的库无法继续正常工作”。这不仅是错误的推理,还是傲慢,客户让他们知道。

答案 1 :(得分:4)

<强>例外

这是许多计划中的常见情况。为了克服这个问题,使用了例外。

  • 为了处理意外情况,会从代码中创建并“抛出”新的异常。
  • 然后他们必须被调用该函数的程序“抓住”。

您可以阅读有关例外here的更多信息。

希望这有帮助。

答案 2 :(得分:3)

正如其他受访者所说,答案应该是:抛出例外......

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);
}

答案 3 :(得分:1)

库永远不会退出hostest应用程序。

使用“return null”,进入“不一致状态”,​​每次调用都返回NULL 库用户必须处理它。

或例外......