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

Handling Try-catch block in a constructor C++

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

 class A{
    A(int i){

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

        otherMethod();              
    }

 }

但是,如果在 try 块中发生错误,则不会调用 otherMethod(),因为执行在 catch 块内结束,我不能像在其他语言中那样使用 finally 来做到这一点。 此外,我什至不确定在 try 块内引发异常时,是否会自动调用析构函数,因此未正确创建对象。

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

如果您已经处理了异常,请不要重新抛出它。删除 throw ex; 以在 catch 块之外进行并正常完成构造函数。

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

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