3. C++ terminate()函数
1.terminate()函数
C++中,异常不可以忽略,当异常找不到匹配的catch字句时,会调用系统的库函数terminate()(在头文件中)。terminate()函数在程序抛出一个异常并且异常没有被捕捉的时候被调用.
默认情况下,terminate()函数调用标准C库函数abort()使程序终止而退出。当调用abort函数时,程序不会调用正常的终止函数,也就是说,全局对象和静态对象的析构函数不会执行。
如果在 main 函数中抛出异常,不处理,则崩溃;如果异常不处理,最后会传到哪里?
下面的代码输出什么?
异常的最终处理编程:
#include <iostream>using namespace std;class Test{public:Test(){cout << "Test()";cout << endl;}~Test(){cout << "~Test()";cout << endl;}};int main(){static Test t; // BCC Test();// VC 2010 Test();// G++ Test();throw ; // BCC Abnormal program termination;// VC 对话框弹出来;// G++ terminate called after throwing an instance of 'int';return ;}
main() 函数中抛出的异常也许会被一个最终的函数处理,
异常无法被处理的情况:
如果异常无法被处理,terminate() 结束函数会被自动调用;
默认情况下,terminate() 调用库函数 abort() 终止程序;
2.set_terminate()函数
通过使用标准的set_terminate()函数,可以设置自己的terminate()函数。自定义的terminate()函数不能有参数,而且返回值类型为void。另外,terminate函数不能返回也不能抛出异常,它必须终止程序。如果terminate函数被调用,这就意味着问题已经无法解决了。
- 参数类型为 void(*)();
- 函数指针,没有参数、没有返回值;
- 返回值为默认的 terminate() 函数入口地址;
例如:
#include <iostream>#include <cstdlib>#include <exception> // C++ 标准库中与异常相关的头文件;using namespace std;void my_terminate(){cout << "void my_terminate()" << endl;exit(); // 结束当前的程序;可以确保所有的全局对象和静态局部对象全部都正常析构;// abort(); // “已放弃”是这个函数打印出来的,这个函数是异常终止一个程序,并且异常终止的时候不会调用任何对象的析构函数;}class Test{public:Test(){cout << "Test()";cout << endl;}~Test(){cout << "~Test()";cout << endl;}};int main(){set_terminate(my_terminate);static Test t; throw ; return ;}
3. C++ terminate()函数相关推荐
- python多进程之进程的terminate() 函数
python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...
- C++异常处理之terminate函数
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理.如此逐级上传,直到最高一级 ...
- 学习用于异常处理的terminate()函数
<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...
- java terminate_学习Java用于异常处理的terminate()函数
异常处理是一个微妙的问题,你应该尽可能优雅地处理所有异常.要达到这个目的,你需要学习terminate()函数. terminate()函数在程序抛出一个异常并且异常没有被捕获的时候被调用,像下面这样 ...
- 【C++】 外传篇 2_函数的异常规格说明
函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ ...
- c++ 多线程 类成员函数_多线程(C++/Python)
多线程(C++/Python) 本文包括一下内容: 通过C++11的标准库进行多线程编程,包括线程的创建/退出,线程管理,线程之间的通信和资源管理,以及最常见的互斥锁,另外对python下多线程的实现 ...
- trap_exit与terminate
今天写代码的发现,关闭app的时候,监控树下的某个进程terminate函数没执行,所以有以下备忘记录 1 erlang:process_flag(trap_exit,true). When trap ...
- python 结束进程 terminate_【Python】multiprocessing.Process.terminate()结束子进程将导致子进程无法执行finally块,如何解决?...
我在使用multiprocessing库创建进程的时候,发现了这么一个问题: https://docs.python.org/3.5/library/multiprocessing.html#mult ...
- C和C++安全编码笔记:动态内存管理
4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...
最新文章
- 腾讯云TDSQL-A发布公有云版本 支持第七次全国人口普查等海量数据场景
- Android——四大组件、六大布局、五大存储
- apt-get卸载命令
- 数据可视化【十四】交互式过滤地区分布图
- Installation error: INSTALL_FAILED_UID_CHANGED
- 欧菲光修正2020年业绩为预计亏损18.5亿元
- rtsp直接转http fmp4
- hive udaf_Hive UDAF 函数的编写
- 分享一个串口调试工具
- finalshell文件列表不显示_软网推荐:文件变动我知晓
- ASP.NET服务器对于请求的处理过程
- Python运行效率低的原因
- 深入浅出DDR系列(二)--DDR工作原理
- 百度API---详解
- 击穿面试官的套路:经典面试问题剖析
- vivado快捷键设置 放大代码_【Vivado那些事】Vivado中常用的快捷键(二)其他常用快捷键...
- HDU 3085 Nightmare Ⅱ【BFS +曼哈顿距离+综合性较强】
- SQL语句的约束 总结
- 在使用uglify是出现:.pipe(uglify()) SyntaxError:Unexpected token .
- Java匿名内部类方法调用