避免析构函数调用特定异常

院长

我在这里简化我的问题,因为我有相当大的代码库,而且我无法制作mcve。

我有一个可能成功或不可能成功构造的对象。如果不是,ObjectUnsupported则在其构造函数中引发种类异常

class Object {
public:
  Object() {

    read_data1();
    ..
    if(unsupported_kind == true)
      throw ObjectUnsupported();
    ..
    read_data2();
  }
  std::vector<char> data1;
  std::vector<char> data2;
};

data1永远读,而data2仅适用于支持的对象。

现在,我正在尝试使用智能指针在其他地方构造对象

std::unique_ptr<Object> obj;
try {
  obj = std::make_unique<Object>();
} catch(ObjectUnsupported& ex) {
  object_is_unsupported = true;
}

if(object_is_unsupported) {
  if(checkIfDataIsNeeded(obj->data1) == false)
    return; // We didn't need it anyway
  else
    throw RuntimeError(); // Data was needed! Abort!
}

data1总是被读取,而data2不是,但这里的重点是:我可能需要它,data2或者根本不需要该对象。

上面的代码不起作用,因为obj调用智能指针的析构函数,因此使我的后续代码出错。

我如何实现我的目标?

理查德·霍奇斯

从构造函数中引发异常不会使您留下一半构造的对象。通过设计,该对象不存在。到异常点为止的所有构造成员都将被销毁。

此处的解决方案是让您的对象支持一个标志,该标志指示其具有多少数据。

例如:

class Object {
public:
    Object() {

        read_data1();
        ..
        if(!unsupported_kind)
        {
            read_data2();
            _has_supported_data = true;
        }
    }

    bool has_supported_data() const {
        return _has_supported_data;
    }

    std::vector<char> data1;
    std::vector<char> data2;

private:
    bool _has_supported_data = false;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

析构函数调用

来自分类Dev

在postOrderDeletion上调用析构函数时引发异常

来自分类Dev

析构函数引发异常

来自分类Dev

从析构函数调用BeginInvoke

来自分类Dev

GDB:调用特定对象的析构函数时的断点

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

来自分类Dev

避免调用可能会引发析构函数的函数

来自分类Dev

在析构函数中捕获异常

来自分类Dev

RAII类的析构函数抛出异常

来自分类Dev

非虚拟析构函数c ++的异常

来自分类Dev

C ++ RAII析构函数异常

来自分类Dev

构造函数中引发了异常:调用了析构函数吗?

来自分类Dev

如果函数提前返回或引发异常,是否将调用对象的析构函数?

来自分类Dev

构造函数中引发了异常:调用了析构函数吗?

来自分类Dev

C ++中的析构函数直接调用

来自分类Dev

C ++:调用了错误的析构函数

来自分类Dev

范围结束之前调用的析构函数

来自分类Dev

delete []是否调用析构函数?

来自分类Dev

使用delete调用析构函数

来自分类Dev

析构函数调用和指针

来自分类Dev

线程多次调用析构函数

来自分类Dev

调用析构函数时出错

来自分类Dev

析构函数的调用量超出预期

来自分类Dev

显式调用析构函数

来自分类Dev

从列表中调用元素的析构函数

来自分类Dev

向量擦除调用的错误析构函数

来自分类Dev

析构函数在C ++中调用向量

来自分类Dev

从析构函数调用线程的向量

来自分类Dev

关于析构函数调用的困惑