在我们的代码库中,我们有许多这样的结构:
auto* pObj = getObjectThatMayVeryRarelyBeNull();
if (!pObj) throw std::runtime_error("Ooops!");
// Use pObj->(...)
Run Code Online (Sandbox Code Playgroud)
在99.99%的情况下,不会触发此检查.我正在考虑以下解决方案:
auto& obj = deref_or_throw(getObjectThatMayVeryRarelyBeNull());
// Use obj.(...)
Run Code Online (Sandbox Code Playgroud)
凡deref_or_throw声明如下:
template<class T> T& deref_or_throw(T* p) {
if (p == nullptr) { throw std::invalid_argument("Argument is null!"); }
return *p;
}
Run Code Online (Sandbox Code Playgroud)
该代码更清晰,可以根据需要使用.
问题是:我是否重新发明轮子?在标准或提升中是否有一些相关的解决方案?或者你对解决方案有一些评论?
PS.相关问题(没有令人满意的答案):是否存在与NullPointerException相当的C++
我有一个小功能(在DLL中),看起来像这样:
int my_function(const char* const s)
{
try {
return my_object->do_something_with(s);
} catch (exception& e) {
return ERROR_CODE;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为try-catch块可以防止内部可能发生的任何事情my_object传播到外部.不幸的是,我错了,我调用此函数的程序(来自VB)刚停止工作,因为我传递了一个空指针参数.
那么,为什么我的try-catch块不能像(I)那样工作呢?有解决方法吗?我以前在Java中编程很多,我认为它会在那里工作......