析构函数抛出异常
来源:互联网 发布:房租占收入比例 知乎 编辑:程序博客网 时间: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() {}
};
(3) 当在某一个析构函数中会有一些可能(哪怕是一点点可能)发生异常时,那么就必须要把这种可能发生的异常完全封装在析构函数内部,决不能让它抛出函数之外(这招简直是绝杀!呵呵!);
- 析构函数抛出异常
- 析构函数抛出异常
- 构造函数、析构函数抛出异常
- 构造函数析构函数抛出异常
- 析构函数中抛出的异常
- 析构函数中抛出的异常
- 析构函数中抛出的异常
- 析构函数中抛出的异常
- 析构函数不能抛出异常
- 析构函数抛出的异常
- 析构函数中抛出的异常
- 析构函数中抛出的异常
- 析构函数中抛出的异常
- 为什么析构函数不能抛出异常
- 析构函数不能抛出异常
- 【中级】C++析构函数抛出异常
- 析构函数不能抛出异常
- 析构函数不能抛出异常
- 题目:二叉树的后序遍历
- 滚动CollectionView控制PageControl实现分页浏览的效果
- 黑马程序员—IO流
- 在delphi中Char,PChar,PByte,Byte,String的相互转换示例
- 题目:二叉树的最大深度
- 析构函数抛出异常
- Delphi流操作技巧
- HDU-1875 畅通工程再续(最小生成树[Prim])
- 题目:二叉树的最小深度
- 初步篇7分支结构程序体验项目1求两数正差值
- PHP foreach 的用法
- 多线程
- 题目:二进制中有多少个1
- Delphi-string转pbyte的方法——Move函数!