RAII捕获构造函数异常的方法

M. *_*ley 9 c++ constructor exception raii

我有一个类可以在其构造函数中抛出异常.如何在try/catch块中声明该类的实例,同时仍然可以在正确的范围内使用它?

try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }

lMyObject.DoSomething(); // lMyObject not in scope!
Run Code Online (Sandbox Code Playgroud)

是否有另一种方法可以实现这一点,同时尊重RAII成语?

我不想使用init()两阶段构造的方法.我能想到的另一件事是:

MyClass* lMyObject;

try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }

std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
Run Code Online (Sandbox Code Playgroud)

工作正常,但我对范围和指针间接的原始指针不满意.这只是另一个C++疣吗?

Max*_*kin 5

如果构造函数抛出这意味着该对象无法初始化,因此无法启动它的存在.

MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (std::exception e) { /* Handle constructor exception */ }
Run Code Online (Sandbox Code Playgroud)

在上面,如果构造函数抛出异常,lMyObject则保持未初始化,换句话说,指针包含一个不确定的值.

有关详细说明,请参阅经典构造函数失败:

我们可以总结一下C++构造函数模型如下:

或者:

(a)构造函数通常在到达其结尾或返回语句时返回,并且该对象存在.

要么:

(b)构造函数通过发出异常退出,并且该对象不仅现在不存在,而且从未存在过.

没有其他可能性.