【问题标题】:Handling Try-catch block in a constructor C++在构造函数 C++ 中处理 Try-catch 块
【发布时间】:2015-03-19 15:55:00
【问题描述】:

我面临的情况是我需要在构造函数中使用 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;

标签: c++ exception constructor try-catch


【解决方案1】:

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

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

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

【讨论】:

  • 不抛出,构造函数还会继续执行otherMehod()吗?
  • @Gabrielecswoosh 是的。在这方面,它就像任何其他代码一样工作。
猜你喜欢
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多