退出()调用函数应该返回一个引用
在一个库中,我有一个函数,在数据库中search一个键,并返回一个非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)); }
它看起来太可怕了! 也许我应该避免这样的function。 请让我知道你的意见!
这种情况非常糟糕,程序无法继续,所以我打印一条消息来帮助发现错误并调用exit(1)
不。如果这个代码是库的一部分,库不应该是决定应用程序是否应该退出的那个。 如果一个文件是打开的,需要closures,或者其他资源需要清理,或者如果你的数据库类的用户想logging错误并继续做其他的事情呢?
答案是什么, 但你现在正在做什么。 抛出exception,返回错误代码等,但不要在库或类代码中closures应用程序。
信不信由你,有一个商业数据库库完成你正在做的事情(closures应用程序)。 他们从图书馆的用户那里得到了很多愤怒的回应,他们为什么会意外closures应用程序。 而且你知道什么 – 给客户的答案是“我们觉得错误严重到足以阻止应用程序,因为我们的图书馆不能继续正常工作”。 这不仅是不好的推理,它接近傲慢,客户让他们知道。
例外
这在很多程序中都是常见的情况。 为了克服这个,使用了exception。
- 为了处理意外的情况,新的exception被创build并从代码中“抛出”。
- 然后他们必须被调用函数的程序“抓住”。
你可以在这里阅读更多关于exception
希望这可以帮助。
正如其他答复者所说,答案应该是:抛出一个例外…
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); }
图书馆不应该退出hostest应用程序。
使用“return null”,进入一个“不一致的状态”,在每个调用中你都返回NULL。
图书馆用户将不得不处理它。
或例外…