1 示例程序
首先我们来看一个简单的在构造函数和析构函数中抛出异常的小程序,如下:
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "construction fun" << endl;
throw 1;
}
~A()
{
cout << "destruction fun " << endl;
throw 2;
}
};
int main()
{
try
{
A a;
}
catch(...)//catch all
{
cout << "caught!" << endl;
}
system("pause");
return(0);
}
//输出
//construction fun
//caught!
//注释掉"throw 1",输出(因为如果构造中抛出异常析构函数不会被执行)
//construction fun
//destruction fun
//caught!
2 总结
构造函数异常,可以总结如下:
① C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;
② 构造函数抛出异常时,析构函数将不会被执行;
③ 抛出异常时,其子对象将被逆序析构。
析构函数异常,可以总结如下:
① C++中析构函数的执行不应该抛出异常;
② 当在某一个析构函数中会有一些可能(哪怕是一点点可能)发生异常时,那么就必须要把这种可能发生的异常完全封装在析构函数内部,决不能让它抛出函数之外;
③ 抛出异常时,其子对象将被逆序析构。
析构函数异常相对要复杂一些,存在一种冲突状态,程序将直接崩溃:异常的被称为“栈展开(stack unwinding)”的过程中时,从析构函数抛出异常,C++运行时系统会处于无法决断的境遇,因此C++语言担保,当处于这一点时,会调用 terminate()来杀死进程。因此,当处理另一个异常的过程中时,不要从析构函数抛出异常。
参考自:
http://blog.csdn.net/believefym/article/details/1836156