当对象被exception处理机制------也就是exception传播过程中的stack------unwinding(栈展开)机制-----销毁。
当destructor被调用时,可能有一个exception正在作用之中。可惜的是我们无法在destructor内区分这些状态。于是,必须在保守的假设下(假设当时有个exception正在作用中)撰写你的destructors。因为如果控制权基于exception的因素离开destructor。而此时正有另一个exception处于作用状态,C++会调用terminate函数。此函数会将程序立即结束掉,甚至不等局部对象被销毁。
简单的说,比如 一个 destructor fun1()调用的时候会抛出一个exception,但是这个函数本身,是因为另外一个exception引起的,此时terminate()函数就被调用了...game over!!
下面看一个简单的代码分析:
类B的析构函数的exception是由于一个异常引发的,因为会导致 terminate函数的调用。。。程序因此over!
为了解决这个问题,我们必须阻止 异常抛出析构函数之外,只需要把B类的析构函数改为如下就可以了
在析构函数内部,捕获处理所有的异常!而且,如果不这样做,不但会引发terminate的调用,也会使得destructor执行不全。因为我们完全有必要----------禁止异常(exceptions)流出destructors之外-------把expection消灭在destructor内!