在库中,我有一个函数,它搜索数据库中的键并返回对象的非const引用。我想要处理找不到键的情况,这通常是由于调用函数时出错造成的。这种情况非常糟糕,以致程序无法继续运行,所以我打印了一条消息来帮助发现错误并调用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));
 }看起来糟透了!也许我应该避免这样的功能。请告诉我你的意见!
发布于 2014-04-03 16:21:20
这种情况非常糟糕,以致程序无法继续运行,因此我打印了一条消息来帮助发现错误并调用exit(1)。
不是的。如果此代码是库的一部分,则不应该由库来决定应用程序是否应该退出。
如果文件已打开并需要关闭,或者需要清理其他资源,或者您的DB类的用户希望记录错误并继续执行其他操作,该怎么办?
答案不是你现在在做什么。抛出异常、返回错误代码等,但不要在库或类代码中关闭应用程序。
信不信由你,这里有一个商业数据库库,它做的正是你正在做的事情(关闭应用程序)。他们收到了许多愤怒的反应,用户的图书馆,为什么他们要关闭应用程序意外。你知道吗--给客户的答案是“我们觉得错误严重到足以停止应用程序,因为我们的库不能继续正常工作”。这不仅是糟糕的推理,而且近乎傲慢,顾客让他们知道这一点。
发布于 2014-04-03 16:14:43
例外
这是许多节目中常见的情况。为了克服这一问题,使用了例外情况。
您可以阅读更多关于异常这里的信息。
希望这能有所帮助。
发布于 2014-04-03 16:33:23
正如其他受访者所说,答案应该是:抛出一个例外.
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);
}https://stackoverflow.com/questions/22843189
复制相似问题