异常处理深度解析

  • 问题一:如果在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