析构函数抛出异常

来源:互联网 发布:房租占收入比例 知乎 编辑:程序博客网 时间:2024/04/23 17:09

http://blog.csdn.net/wind19/article/details/8213406

析构函数抛出异常是可以的,C++并没有禁止析构函数引发异常,但是C++不推荐这一做法,从析构函数中抛出异常是及其危险的

class MyTest_Base
{
public:
virtual ~ MyTest_Base () 
{
cout << "开始准备销毁一个MyTest_Base类型的对象"<< endl;

// 注意:在析构函数中抛出了异常
throw std::exception("在析构函数中故意抛出一个异常,测试!");
}

void Func() throw()
{
throw std::exception("故意抛出一个异常,测试!");
}

void Other() {}

};

void main()
{
try
{
// 构造一个对象,当obj对象离开这个作用域时析构将会被执行
MyTest_Base obj;


// 下面这条语句是新添加的
// 调用这个成员函数将抛出一个异常
obj.Func();

obj.Other();
}
catch(std::exception e)
{
cout << e.what() << endl;
}
catch(...)
{
cout << "unknow exception"<< endl;
}
}

  注意,修改后的程序现在的运行结果:非常的不幸,程序在控制台上打印一条语句后就崩溃了(如果程序是debug版本,会显示一条程序将被终止的断言;如果是release版本,程序会被执行terminate()函数后退出)。


其实还是有很好办法来解决的。那就是把异常完全封装在析构函数内部,决不让异常抛出函数之外。这是一种非常简单,也非常有效的方法。按这种方法把上面的程序再做一点改动,那么程序将避免了崩溃的厄运。如下:

class MyTest_Base
{
public:
virtual ~ MyTest_Base () 
{
cout << "开始准备销毁一个MyTest_Base类型的对象"<< endl;

// 一点小的改动。把异常完全封装在析构函数内部
try
{
// 注意:在析构函数中抛出了异常
throw std::exception("在析构函数中故意抛出一个异常,测试!");
}
catch(…) {}

}

void Func() throw()
{
throw std::exception("故意抛出一个异常,测试!");
}

void Other() {}

};

(1) C++中析构函数的执行不应该抛出异常;

(3) 当在某一个析构函数中会有一些可能(哪怕是一点点可能)发生异常时,那么就必须要把这种可能发生的异常完全封装在析构函数内部,决不能让它抛出函数之外(这招简直是绝杀!呵呵!);

0 0