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

Handling Try-catch block in a constructor C++

本文关键字:Try-catch 中的 C++ 构造函数 处理      更新时间:2023-10-16

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

 class A{
    A(int i){
        try{
            setDevice(i);
        }
        catch(DeviceException& ex){
            setDevice (0);
            throw ex;
        }
        otherMethod();              
    }
 }

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

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

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

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

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