首页 > 其他 > 详细

异常处理深度解析

时间:2020-02-15 12:49:13      阅读:63      评论:0      收藏:0      [点我收藏+]
  • 问题一:如果在main函数中抛出异常会发生什么?
  1. 如果异常无法处理,terminate()结束函数会被自动调用
  2. 默认情况下,terminate()调用库函数abort()终止程序
  3. abort()函数使得程序执行异常而立刻退出
  4. C++支持替换默认的terminate()函数实现
  • terminate()函数的替换
  1. 自定义一个无返回值无参数的函数,不能抛出任何异常,必须以某种方式结束当前的程序
  2. 调用set_terminate()设置自定义的结束函数,参数类型为void(*)(),返回值为默认的terminate()函数入口地址。
#include <iostream>
#include <string>
#include <exception>
using namespace std;
class Test
{
public:
        Test()
        {
               cout << "Test" << endl;
        }
        ~Test()
        {
               cout << "~Test" << endl;
        }
};
void my_terminate()
{
        cout << "void my_terminate()" << endl;
        //确保所有全局对象和静态局部对象全部正常启动
        exit(1);
        //异常中止程序,不会调用对象的析构函数
        //abort();
}
int main()
{
        set_terminate(my_terminate);
        static Test t;
        throw 1;
        return 0;
}
  • 运行结果
Test
void my_terminate()
~Test
  • 问题二:如果析构函数中抛出异常会发生什么?
  1. 不要在析构函数中抛出异常,析构函数主要用来释放系统资源的地方,如果抛出异常,会得不到资源的正确释放
  2. 有可能导致terminate函数被重复调用,是系统进入一个不稳定的状况
  • 小结
  1. 如果异常没有被处理,最后terminate()结束整个程序
  2. terminate()是整个程序释放系统资源的最后机会
  3. 结束函数可以自定义,但不能继续抛出异常
  4. 析构函数中不能抛出异常,可能导致terminate()多次调用。
 
 
 

异常处理深度解析

原文:https://www.cnblogs.com/chengeputongren/p/12311002.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!