zoukankan      html  css  js  c++  java
  • 异常处理深度解析

    • 问题一:如果在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()多次调用。
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    面向中后台复杂场景的低代码实践思路
    树莓派使用raspivid实时预览视频
    grep rn无法匹配文件中的字符串
    C++有关std::sort和std::bind那些事
    C++有关unordered_map::erase的奇怪bug
    ssh与tar的奇妙组合
    git指定仓库使用特定用户名提交
    在win7下搭建php+apache+mysql环境
    神乎其神的技艺
    好书推荐——《启动大脑》
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12311002.html
Copyright © 2011-2022 走看看