给定一种情况,我想分配一个可能在构造过程中引发但要在调用站点处理异常的对象的堆栈,如何使该对象从构造它的try块外部可以访问?
例如
class MyThrowingClass {
MyThrowingClass() {throw exception();}
doSomethingImportant() {
//...
}
};
int main() {
//Need to catch the exception:
try {
MyThrowingClass myObj;
} catch() {
//actually handle the error
//...
}
//Also need to use myObj later on
myObj.doSomethingImportant();//but we can't use it here because it was scoped to the try block...
}
如果我将myObj放入try中,则try范围之外的任何内容都看不到,但我不想在其中包含其他所有内容,因为这样代码就会变成30个嵌套try块级别,这就是异常处理的内容应该使用替代初始化函数错误代码删除。
我无法在构造函数中处理异常,因为对异常的反应取决于MyThrowingClass的使用上下文。
显然,可以通过以下方法解决该问题:
MyThrowingClass* pMyObj;
然后能够包装
pMyObj = new MyThrowingClass();
但是肯定也可以通过堆栈分配的对象来实现吗?
是做类似事情的唯一解决方案
MyThrowingClass myObj;
try {
myObj.init();
} catch(...) {
//...
}
在这一点上,我们又回到了与错误代码一样糟糕的状态,并且拥有未初始化或部分初始化的对象。
请注意,这并不是要成为全局对象,我想在许多地方都可以实例化某些东西。
确实有一个try块包装整个作用域(这里所有内容都在main内)并在该try块的末尾捕获可处理所有可能异常的catch,而不是能够模糊地处理异常,这是否是理想的解决方案?到他们的网站?
int main() {
try {
//absoultely everything
}
catch (exceptionTypeA &a) {
//...
}
catch exceptionTypeB &b) {
}
}
如何使对象从构造它的try块外部可以访问?
如果构建失败,则该对象不存在;否则,该对象将不存在。所以没有东西可访问。
当然这也应该可以通过堆栈分配的对象来实现吗?
自动(即,堆栈分配)对象仅初始化一次,因此即使您处理了异常,也无法返回并尝试重新初始化它。如果确实希望重试,则必须使用更复杂的方法,例如建议的动态分配或两阶段初始化。另一个选择是boost::optional
(或从明年开始std::optional
),它使您可以在一次自动存储中随意创建和销毁对象。
拥有包裹整个作用域的try块真的是理想的解决方案吗?
在典型情况下,不是在本地处理异常,并且初始化失败表明存在不可恢复的错误,是的。在特殊情况下,您可以在本地处理它并进行恢复,没有。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句