条款08:析构中的异常不要走出函数

这个标题说的奇奇怪怪的,意思是这样的:如果我们在析构函数中出现了异常,一定不要抛出去,而是要进行处理。

这里的处理可以是终止程序,也可以是忽视这个异常,将他放到日志里去。

原因也是很简单,比如说一个作用域结束时,一个vector<Class>要进行销毁,那么要删除里边的所有的Class对象,此时如果在Class的析构函数里吐出异常,那么可能会在C++里积压数十个异常,这会导致不明确行为。

那怎么办呢?我们可以将会吐出异常的代码抽象成一个函数,交给用户去在销毁前调用,让用户有一个处理的机会。

如果还是不幸确实产生了异常,那么直接终止程序也是一个不错的选择。

class B {
  ~B() {
    try {
      ...
    } catch () {
      std::abort();
    }
  }
};

或者,也可以将这个异常吞下去,记录日志,而继续程序。

results matching ""

    No results matching ""