【发布时间】:2014-05-15 14:37:52
【问题描述】:
在一个库中,我有一个函数可以在数据库中搜索一个键并返回一个对对象的非常量引用。我想处理没有找到密钥的情况,这通常是由于调用函数时出错引起的。这种情况非常糟糕,程序无法继续运行,所以我打印了一条消息以帮助发现错误并致电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));
}
看起来好可怕!也许我应该避免这样的功能。请告诉我你的意见!
【问题讨论】:
-
你不需要 return 语句,因为你永远不会到达函数的末尾。 (不过,一些编译器可能会发出警告。)
-
@JamesKanze 是的,这完全是为了避免编译器警告。但由于收到大量建议,我现在正在考虑使用异常。即使它们没有被发现导致核心转储,它们看起来仍然是退出该功能的更好方法。
-
@DarioP 我并不反对其他 cmets。我倾向于在 C++ 中完全避免
exit(因为它不调用任何局部变量的析构函数),并将错误传播到main,我可以从那里返回。 -
您可能应该使用答案所示的异常。但是,从技术角度来看,您可以通过颠倒测试的意义来解决手头的问题。在 if 语句中使用
!my_db.key_exists(k)。