http://blog.csdn.net/zicheng_lin/article/details/6460373#
当对象被exception处理机制------也就是exception传播过程中的stack------unwinding(栈展开)机制-----销毁。
当destructor被调用时,可能有一个exception正在作用之中。可惜的是我们无法在destructor内区分这些状态。于是,必须在保守的假设下(假设当时有个exception正在作用中)撰写你的destructors。因为如果控制权基于exception的因素离开destructor。而此时正有另一个exception处于作用状态,C++会调用terminate函数。此函数会将程序立即结束掉,甚至不等局部对象被销毁。
简单的说,比如 一个 destructor fun1()调用的时候会抛出一个exception,但是这个函数本身,是因为另外一个exception引起的,此时terminate()函数就被调用了...game over!!
#include <iostream>
using namespace std;
double fun(double x, double y) //定义函数
{
if(y==0)
{
throw y; //除数为0,抛出异常
}
return x/y; //否则返回两个数的商
}
class B
{
public:
~B()
{
int a = fun(4,0); //因为除数为0,会抛出异常
}
private:
double resB;
};
class A
{
public:
A()
{
try
{
B b; //在A的构造函数中,构造一个对象b,构造函数抛出了一个异常,导致控制权离开该函数
resA = fun(4,0);//从而引发对象b调用B类的析构函数,(注意一个抛出异常的析构函数)
}
catch(double&) //捕获并处理异常
{
cerr<<"error of dividing zero./n";
}
}
private:
double resA;
};
void Exceptions()
{
A a;
}
int main()
{
Exceptions();
return 0;
}
类B的析构函数的exception是由于一个异常引发的,因为会导致 terminate函数的调用。。。程序因此over!
为了解决这个问题,我们必须阻止 异常抛出析构函数之外,只需要把B类的析构函数改为如下就可以了
~B()
{
try
{
int a = fun(4,0); //因为除数为0,会抛出异常
}
catch(...) //捕获并处理异常
{
}
}
类B的析构函数的exception是由于一个异常引发的,因为会导致 terminate函数的调用。。。程序因此over!
为了解决这个问题,我们必须阻止 异常抛出析构函数之外,只需要把B类的析构函数改为如下就可以了
类B的析构函数的exception是由于一个异常引发的,因为会导致 terminate函数的调用。。。程序因此over!
为了解决这个问题,我们必须阻止 异常抛出析构函数之外,只需要把B类的析构函数改为如下就可以了
在析构函数内部,捕获处理所有的异常!而且,如果不这样做,不但会引发terminate的调用,也会使得destructor执行不全。因为我们完全有必要----------禁止异常(exceptions)流出destructors之外-------把expection消灭在destructor内!