More effective c++ 11(禁止异常(exceptions)流出destructors之外)

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内!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值