【发布时间】:2015-05-21 05:57:42
【问题描述】:
在我们的代码库中,我们有很多这样的结构:
auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)
在 99.99% 的情况下,不会触发此检查。我正在考虑以下解决方案:
auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)
其中deref_or_throw 声明如下:
template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}
该代码更清晰,可以按我的需要工作。
问题是:我是在重新发明轮子吗?标准或增强中有一些相关的解决方案吗?或者你有一些关于解决方案的 cmets?
PS。相关问题(没有满意答案):Is there a C++ equivalent of a NullPointerException
【问题讨论】:
-
是否有任何代码实际处理
nullptr案例?例如。像if ( !obj ) { std::cout << "Null, but still okay, moving on with something meaningful\n"; } else { std::cout << "Non-Null, doing something else\n"; }这样的东西。还是nullptr案例总是“退出,因为这是错误的”路径? -
此代码存在,但很少见。在大多数情况下,我们无法继续。我们无能为力。整个例程毫无意义。那么也许这个对象的存在是一个前置条件?我需要检查它,然后手动取消引用指针而不用担心?
-
这正是你需要为自己澄清的,恕我直言。如果这是一个先决条件,那么
assertion 可能更合适。否则,这显然是一件特殊的事情(0.01% 是相当特殊的),所以exception是合适的。 Afaik,图书馆里没有这样的东西。 -
我认为您应该详细说明此主题并将其发布为答案。
-
如果从 getObjectThatMayVeryRarelyBeNull 函数中抛出异常怎么办?
标签: c++ exception nullpointerexception dereference