【发布时间】:2013-01-20 13:04:10
【问题描述】:
我有一个可以在其构造函数中抛出异常的类。如何在 try/catch 块中声明该类的实例,同时仍使其在正确的范围内可用?
try { MyClass lMyObject; }
catch (const std::exception& e) { /* Handle constructor exception */ }
lMyObject.DoSomething(); // lMyObject not in scope!
在尊重RAII 成语的同时,有没有其他方法可以做到这一点?
我不希望将init() 方法用于两阶段构建。我唯一能想到的其他事情是:
MyClass* lMyObject;
try { lMyObject = new MyClass(); }
catch (const std::exception& e) { /* Handle constructor exception */ }
std::shared_ptr<MyClass> lMyObjectPtr(lMyObject);
lMyObjectPtr->DoSomething();
工作正常,但我对范围和指针间接中的原始指针不满意。这只是另一个 C++ 疣吗?
【问题讨论】:
-
将 DoSomething() 方法调用移至 try 块?
-
从不通过复制捕获异常。坚持不断的引用。
-
在第二个例子中,如果构造函数抛出,
lMyObject是一个未初始化的指针。 -
@VladLazarenko:感谢您指出价值捕获
标签: c++ exception constructor raii