堆栈对象的C ++构造函数异常处理

用户名

给定一种情况,我想分配一个可能在构造过程中引发但要在调用站点处理异常的对象的堆栈,如何使该对象从构造它的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块级别,这就是异常处理的内容应该使用替代初始化函数错误代码删除。

我无法在构造函数中处理异常,因为对异常的反应取决于M​​yThrowingClass的使用上下文。

显然,可以通过以下方法解决该问题:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用move构造函数引发异常?(C ++)

来自分类Dev

C ++在构造函数中捕获异常

来自分类Dev

调用构造函数时异常的C ++行为

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

在对象构造函数中引发异常

来自分类Dev

C ++类构造函数引发异常

来自分类Dev

类构造函数中异常处理的行为

来自分类Dev

在C#自定义异常处理的情况下如何进行构造函数调用?

来自分类Dev

在构造函数C ++中处理Try-catch块

来自分类Dev

如何最好地处理C ++对象初始化:空构造函数或指针?

来自分类Dev

C ++为什么在堆栈中构造完对象后立即调用析构函数?

来自分类Dev

构造函数中的异常处理

来自分类Dev

什么时候构造函数调用中的堆栈对象?

来自分类Dev

C ++,处理构造函数的异常

来自分类Dev

使用cython从C ++构造函数传播异常

来自分类Dev

创建com对象时构造函数中的异常

来自分类Dev

试图将构造函数设置为0的未处理异常-C ++

来自分类Dev

C ++重载异常的构造函数

来自分类Dev

在构造函数C ++中引发异常

来自分类Dev

类构造函数中异常处理的行为

来自分类Dev

C#-构造函数-更改处理程序对象

来自分类Dev

创建异常时构造函数语法上的差异(C ++)

来自分类Dev

C ++为什么在堆栈中构造完对象后立即调用析构函数?

来自分类Dev

如何从C ++中的构造函数中捕获异常

来自分类Dev

C ++,静态对象构造函数中的异常会绕过先前静态对象的析构函数

来自分类Dev

C#的自定义异常处理中的base()构造函数。它是如何工作的?

来自分类Dev

可以从请求对象构造CSRF-CSRF构造函数异常吗?

来自分类Dev

Qt C ++未处理的异常堆栈跟踪

来自分类Dev

构造函数中的异常 - C++

Related 相关文章

热门标签

归档