我面临的情况是我需要在构造函数中使用try-catch块。特别是,构造函数尝试调用try块中的函数,如果失败,它将调用另一个函数来设置一些值。在这两种情况下,构造函数都应该正确创建对象,在这两种情况下,它必须在结束之前调用其他方法。情况如下:
class A{
A(int i){
try{
setDevice(i);
}
catch(DeviceException& ex){
setDevice (0);
throw ex;
}
otherMethod();
}
}
但是,如果try块中发生错误,则不会调用otherMethod()
,因为执行在catch块内结束,并且我不能像其他语言一样最终使用它来执行此操作。
此外,我甚至不确定当在try块内引发异常时,是否自动调用了析构函数,因此没有正确创建对象。
在这种情况下你有什么建议?即使到达了catch块,是否正确创建了对象?
答案 0 :(得分:4)
如果处理了异常,请不要重新抛出异常。删除throw ex;
以继续catch
块并正常完成构造函数。
如果异常离开构造函数,则认为该对象尚未初始化。析构函数不会被调用;但是对于任何成员和基础子对象的那些将被释放,并且将释放为该对象分配的内存。
(如果你确实想要重新抛出,那应该只是throw;
以避免制作异常对象的新副本。但你也不希望这样。)