C++笔记 外传篇1 异常处理深度解析

外传篇1 异常处理深度解析

1.异常处理深度解析

问题:如果在main函数中抛出异常会发生什么?会被最终的全局函数处理掉,c++编译器之间存在差异
如果异常不处理,最后会传到哪里?
在这里插入图片描述
在这里插入图片描述

E1-1 异常的最终处理?

#include <iostream>
using namespace std;
class Test 
{
public:
    Test() 
    {
        cout << "Test()"; 
        cout << endl;
    }
	
    ~Test() 
    {
        cout << "~Test()"; 
        cout << endl;
    }
};
int main()
{
    static Test t;
    
    throw 1;
	
    return 0;
}
运行结果
Test()
terminate called after throwing an instance of 'int'
Aborted (core dumped)(已放弃)

如果异常无法被处理,terminate()结束函数会被自动调用
默认情况下,terminate()调用库函数abort()终止程序
abort()函数使得程序执行异常而立即退出
C++支持替换默认的terminate()函数实现
terminate()函数的替换
自定义一个无返回值无参数的函数
不能抛出任何异常
必须以某种方式结束当前程序
调用set_termianate()设置自定义的结束函数
参数类型为void(*)()
返回值为默认的terminate()函数入口地址

E1-2 自定义结束函数

#include <iostream>
#include <cstdlib>
#include <exception>//c++标准库头文件,都是与异常相关的头文件
using namespace std;
void my_terminate()
{
    cout << "void my_terminate()" << endl;
exit(1);//保证全局对象和静态局部对象被调用
//abort();
/*Test()
void my_terminate()
Aborted (core dumped)
*/
}
class Test 
{
public:
    Test() 
    {
        cout << "Test()"; 
        cout << endl;
    }
	
    ~Test() 
    {
        cout << "~Test()"; 
        cout << endl;
    }
};
int main()
{
    set_terminate(my_terminate);
    
    static Test t;//静态局部对象
    
    throw 1;
	
    return 0;
}
运行结果
Test()
void my_terminate()
~Test()

面试题:如果析构函数中抛出异常会发生什么情况?
不要在析构函数中抛出异常
1.析构函数是释放资源的地方,如果抛出异常,有可能导致资源得不到正确的释放
2.在析构函数中抛出异常有可能导致全局结束函数terminate()被重复调用,有可能会让系统进入不稳定状态

E1-3 析构函数中抛出异常

#include <iostream>
#include <cstdlib>
#include <exception>
using namespace std;
void my_terminate()
{
    cout << "void my_terminate()" << endl;
    exit(1);
    //abort();
}
class Test 
{
public:
    Test() 
    {
        cout << "Test()"; 
        cout << endl;
    }
	
    ~Test() 
    {
        cout << "~Test()"; 
        cout << endl;
        
        throw 2;
    }
};
int main()
{
    set_terminate(my_terminate);
    
    static Test t;
    
    throw 1;
	
    return 0;
}
运行结果
exit(1);输出结果
Test()
void my_terminate()
~Test()
Aborted (core dumped)
abort();输出结果
Test()
void my_terminate()
Aborted (core dumped)

小结
如果异常没有被处理,最后terminate()结束整个程序
terminate()是整个程序释放系统资源的最后机会(可以打印字符串或者弹出个对话框)
结束函数可以自定义,但不能继续抛出异常
析构函数中不能抛出异常,可能导致terminate()多次调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值