};
void main()
{
try
{
// 构造一个对象,当obj对象离开这个作用域时析构将会被执行
MyTest_Base obj;
obj.Other();
}
catch(std::exception e)
{
cout << e.what() << endl;
}
catch(...)
{
cout << "unknow exception"<< endl;
}
}
程序运行的结果是:
开始准备销毁一个MyTest_Base类型的对象
在析构函数中故意抛出一个异常,测试!
从上面的程序运行结果来看,并没有什么特别的,在程序中首先是构造一个对象,当这个对象在离开它的作用域时,析构函数被调用,此时析构函数中抛出一个std::exception类型的异常,因此后面的catch(std::exception e)块捕获住这个异常,并打印出异常错误信息。这个过程好像显现出,发生在析构函数中的异常与其它地方发生的异常(如对象的成员函数中)并没有什么太大的不同,除了析构函数是隐式调用的以外,但这也丝毫不会影响到异常处理的机制呀!那究竟区别何在?玄机何在呢?继续往下看吧!
2、在上面的程序基础上做点小的改动,程序代码如下:
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()函数后退出)。在主人公阿愚的机器上运行的debug版本的程序结果如下: