条款08:析构中的异常不要走出函数
这个标题说的奇奇怪怪的,意思是这样的:如果我们在析构函数中出现了异常,一定不要抛出去,而是要进行处理。
这里的处理可以是终止程序,也可以是忽视这个异常,将他放到日志里去。
原因也是很简单,比如说一个作用域结束时,一个vector<Class>
要进行销毁,那么要删除里边的所有的Class
对象,此时如果在Class
的析构函数里吐出异常,那么可能会在C++里积压数十个异常,这会导致不明确行为。
那怎么办呢?我们可以将会吐出异常的代码抽象成一个函数,交给用户去在销毁前调用,让用户有一个处理的机会。
如果还是不幸确实产生了异常,那么直接终止程序也是一个不错的选择。
class B {
~B() {
try {
...
} catch () {
std::abort();
}
}
};
或者,也可以将这个异常吞下去,记录日志,而继续程序。