异常处理深度解析
-
问题一:如果在main函数中抛出异常会发生什么?
-
如果异常无法处理,terminate()结束函数会被自动调用
-
默认情况下,terminate()调用库函数abort()终止程序
-
abort()函数使得程序执行异常而立刻退出
-
C++支持替换默认的terminate()函数实现
-
terminate()函数的替换
-
自定义一个无返回值无参数的函数,不能抛出任何异常,必须以某种方式结束当前的程序
-
调用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
-
问题二:如果析构函数中抛出异常会发生什么?
-
不要在析构函数中抛出异常,析构函数主要用来释放系统资源的地方,如果抛出异常,会得不到资源的正确释放
-
有可能导致terminate函数被重复调用,是系统进入一个不稳定的状况
-
小结
-
如果异常没有被处理,最后terminate()结束整个程序
-
terminate()是整个程序释放系统资源的最后机会
-
结束函数可以自定义,但不能继续抛出异常
-
析构函数中不能抛出异常,可能导致terminate()多次调用。
主要记录的是学习听课的笔记