c++ - 如果我自己的构造函数在不求助于 "new"的情况下不能抛出,我该如何减轻聚合对象构造函数的异常?

标签 c++ exception

我的 C++ 类聚合了一个辅助对象,它可能会在构造函数中抛出异常,但我自己的类不能抛出(我自己的类被一个框架使用,该框架没有为构造函数抛出的异常做好准备)。现在,我通过使用 new 创建对象来延迟 helper 对象的构造,从而降低这种风险,以便我能够捕获任何异常:

struct HelperObject {
  HelperObject() {
    throw 0;
  }
}

struct MyObject {
  HelperObject *o;
  MyObject() : o( 0 ) {
    try {
      o = new HelperObject;
    } catch ( ... ) {
      // ...
    }
  }
};

然而,为此滥用 new 有点烦人;我突然不得不无缘无故地处理整个代码的指针,除了它允许我更好地控制对象的构造时间。

是否可以在不使用 new 的情况下达到这种效果?

最佳答案

可以使用智能指针和额外的 MakeHelperObject 函数,以便在 HelperObject 域内完成异常。这只会使 MyObject 代码干净,但在 HelperObject 构造期间仍需要处理异常:

struct HelperObject {
  HelperObject() {
    throw 0;
  }

   static HelperObject* MakeHelperObject()
   {
     try
     {
       HelperObject* p = new HelperObject();
       return p; 
     }
     catch(const SomeException& e)
     {
      // deal with e
    }
    return NULL;
  }
};


struct MyObject {
  std::unique_ptr<HelperObject> o;
  MyObject() : o(HelperObject::MakeHelperObject())
  {
  }
};

关于c++ - 如果我自己的构造函数在不求助于 "new"的情况下不能抛出,我该如何减轻聚合对象构造函数的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14137653/

相关文章:

java - 渲染时出现 NullPointerException 错误

python - 在生成器中引发异常,在其他地方处理它,反之亦然在 python 中

java - 我不断收到以下错误消息 java.lang.IllegalStateException : Buffers have not been created

c++ - 使用 set.insert( key ) 作为条件?

c++ - 为什么 Visual Studio 2015 不链接到依赖的 dll 项目

android - OpenSL ES - 安卓工作室 - NDK 10R

c++ - 为什么异常总是在具有可破坏堆栈对象的非叶函数中产生开销?

c++ - 32 位与 64 位 : Massive Runtime Difference

c++ - 协程 TS 2017 的实现示例

DateTime 对象的 PHP 异常处理