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()多次调用