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

时间:2015-03-19 15:55:00

标签: c++ exception constructor try-catch

我面临的情况是我需要在构造函数中使用try-catch块。特别是,构造函数尝试调用try块中的函数,如果失败,它将调用另一个函数来设置一些值。在这两种情况下,构造函数都应该正确创建对象,在这两种情况下,它必须在结束之前调用其他方法。情况如下:

 class A{
    A(int i){

        try{
            setDevice(i);
        }
        catch(DeviceException& ex){
            setDevice (0);
            throw ex;
        }

        otherMethod();              
    }

 }

但是,如果try块中发生错误,则不会调用otherMethod(),因为执行在catch块内结束,并且我不能像其他语言一样最终使用它来执行此操作。 此外,我甚至不确定当在try块内引发异常时,是否自动调用了析构函数,因此没有正确创建对象。

在这种情况下你有什么建议?即使到达了catch块,是否正确创建了对象?

1 个答案:

答案 0 :(得分:4)

如果处理了异常,请不要重新抛出异常。删除throw ex;以继续catch块并正常完成构造函数。

如果异常离开构造函数,则认为该对象尚未初始化。析构函数不会被调用;但是对于任何成员和基础子对象的那些将被释放,并且将释放为该对象分配的内存。

(如果你确实想要重新抛出,那应该只是throw;以避免制作异常对象的新副本。但你也不希望这样。)