C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,

学会使用terminate函数有助于异常处理

一 当一个异常产生的时候调用terminate函数,代码:

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. #include <exception>
  3. using namespace std;
  4. void on_terminate(){
  5. cout<<"terninate function called!"<<endl;
  6. cin.get();
  7. }
  8. int main(void){
  9. set_terminate(on_terminate);
  10. throw exception();
  11. cout<<"terminate function not called!"<<endl;
  12. cin.get();
  13. return 0;
  14. }

terminate被调用的情况:
1 当发送一个异常,并且构造函数产生异常
2 当发送一个异常,或者析构函数产生异常
3 一个静态对象的构造或者析构发送一个异常
4 以atexit注册的函数发生异常的时候
5 自定义一个异常,但是实际上没有异常产生的时候
6 调用缺省的unexcepted()函数时候
例子说话:

[cpp] view plaincopyprint?

  1. #include <iostream>
  2. #include <exception>
  3. using namespace std;
  4. void on_terminate(){
  5. cout<<"terminate function called!"<<endl;
  6. cin.get();
  7. }
  8. class custom_exception{
  9. custom_exception(){
  10. }
  11. custom_exception(const custom_exception& excep){
  12. throw exception();
  13. }
  14. };
  15. void case_1(){
  16. try{
  17. throw custom_exception();
  18. }
  19. catch(...){
  20. }
  21. }

当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。
同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。

[cpp] view plaincopyprint?

  1. #include<iostream>
  2. using namespace std;
  3. class X
  4. {
  5. public:
  6. class Trouble {};   //注意:类中嵌套类的申明和定义,学习!!!
  7. class small: public Trouble {};
  8. class big:public Trouble {};//类中的继承!!!
  9. void f(){
  10. throw big();
  11. }
  12. };
  13. int main()
  14. {
  15. X x;
  16. try{
  17. x.f();
  18. }
  19. catch(X::Trouble &)
  20. {
  21. cout<<"caught Trouble"<<endl;
  22. }
  23. catch(X::small&)
  24. {
  25. cout<<"caught small"<<endl;
  26. }
  27. catch(X::big&)
  28. {
  29. cout<<"caught big"<<endl;
  30. }
  31. return 0;
  32. }

如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用...可以捕捉所有的异常,这个应该放到最后面才可以。
省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。

https://blog.csdn.net/wangyin159/article/details/46584257?ref=myread

C++异常处理之terminate函数相关推荐

  1. 学习用于异常处理的terminate()函数

    <script type="text/javascript"> google_ad_client = "pub-8800625213955058"; ...

  2. java terminate_学习Java用于异常处理的terminate()函数

    异常处理是一个微妙的问题,你应该尽可能优雅地处理所有异常.要达到这个目的,你需要学习terminate()函数. terminate()函数在程序抛出一个异常并且异常没有被捕获的时候被调用,像下面这样 ...

  3. python多进程之进程的terminate() 函数

    python多进程之进程的terminate() 函数 terminate() 函数 是用来杀死子进程的 举例如下: from multiprocessing import Process impor ...

  4. 3. C++ terminate()函数

    1.terminate()函数 C++中,异常不可以忽略,当异常找不到匹配的catch字句时,会调用系统的库函数terminate()(在头文件中).terminate()函数在程序抛出一个异常并且异 ...

  5. C++专题:异常处理与转换函数,智能指针,STL模板

    目录 异常处理 转换函数 智能指针 STL标准模板库 异常处理 什么是异常? 程序中常见的错误分为两大类:编译时错误和运行时错误.编译时的错误主要是语法错误,如关键字拼写错误.语句末尾缺分号.括号不匹 ...

  6. 量化交易之python基础篇 - 常规异常处理、在函数中主动抛出异常

    # 常规异常处理 try:num = int(input("请输入一个整数:"))result = 100 / numprint(result) except ZeroDivisi ...

  7. C++程序闪退原因定位

    内部直接或者间接调用了terminate函数或者abort函数,terminate函数内部也是默认调用了abort函数. C++异常处理之terminate函数 C++中处理异常的过程是这样的:在执行 ...

  8. 学习资料2900篇(4~6)

    1451 round 方法  1452 RSS 2.0 Specification  1453 Ruby入门之代码块.迭代子和过程对象  1454 SAS9新体验:在DATA STEP中使用JAVA对 ...

  9. 【C++】 外传篇 2_函数的异常规格说明

    函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ ...

最新文章

  1. Exchange企业实战技巧(5)配置OWA域名简写
  2. unity3d鼠标拖拽模型,旋转模型
  3. 1986年讲MDCT的基础性论文
  4. C#中的线程(三) 使用多线程
  5. spring整合hibernate的applicationContext.xml文件配置以及web.xml
  6. 问题:anaconda: command not found 解决方案
  7. 4G + 1G = 5G?
  8. 使用 JS 实现页面跳转的几种方式总结,小菜一碟!
  9. 基于Dx11写一个自己的游戏引擎--1
  10. VTK源码阅读--vtkObject类-观察者/命令模式
  11. Android Camera:从零开发一款相机APP Day01:前景
  12. 用Excel自动产生日期
  13. 数学里上凹,下凹,上凸,下凸
  14. 免费银行卡验证API接口
  15. Python——习题:生成银行卡号和密码
  16. repo 工具使用手册
  17. 励志名言---002
  18. 利用VMware搭建centos环境
  19. python3.7 匹配淘口令
  20. 【HTML+CSS】日历备忘录(静态)

热门文章

  1. Coresight - Devicetree/ACPI简介
  2. C语言-字符串匹配题目
  3. 2018年中国(上海)国际乐器本特历奈特钢琴荣耀参展
  4. GWAS全基因组关联分析流程(BWA+samtools+gatk+Plink+Admixture+Tassel)
  5. 【音视频】Ubuntu环境安装以及ffmpeg安装
  6. 【每日随笔】摩托车驾驶 ④ ( 德州增驾摩托车 D 本记录 | 考场位置 “ 德州市公安局交警支队直属四大队车辆管理所 “ )
  7. js获取本机的外网/广域网ip地址
  8. P3225 [HNOI2012] 矿场搭建
  9. 西南名族大学计算机科学与技术学院,西南民族大学计算机科学与技术学院副院长雷开彬一行来我院调研...
  10. [kotlin]kotlin中的伴生对象(companion object)到底是个什么东西?