如果我自己的构造函数必须在不诉诸"new"的情况下抛出,如何缓解聚合对象构造函数的异常?

How do I mitigate exceptions from constructors of aggregated objects if my own constructor must not throw without resorting to "new"?

本文关键字:构造函数 何缓解 异常 对象 new 自己的 我自己 如果 情况下      更新时间:2023-10-16

我的c++类聚合了一个helper对象,这个对象可能会在构造函数中抛出异常,但是我自己的类不能抛出(我自己的类是由一个框架使用的,这个框架没有为构造函数抛出异常做准备)。现在,我通过使用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())
  {
  }
};

嗯,不,因为你需要抑制异常,你只能用try块来做,而函数try块不允许你抑制异常。这有点回避了一个问题:如果框架认为它成功构建了现在有一个大洞的对象,它将如何表现。

您应该考虑使用一个作用域指针来自动释放HelperObject。它使代码更有弹性。