C++异常处理:系统函数terminate的调用

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

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

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

  1. [cpp] view plaincopyprint? #include <iostream>    #include <exception>    using namespace std;   void on_terminate(){   cout<<"terninate function called!"<<endl;    cin.get();   }   int main(void){    set_terminate(on_terminate);    throw exception();    cout<<"terminate function not called!"<<endl;    cin.get();   return 0;   }

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

  1. [cpp] view plaincopyprint? #include <iostream>    #include <exception>    using namespace std;   void on_terminate(){   cout<<"terminate function called!"<<endl;   cin.get();   }   class custom_exception{    custom_exception(){    }   custom_exception(const custom_exception& excep){    throw exception();    }   };   void case_1(){   try{     throw custom_exception();   }    catch(...){    }   }

    当一个函数抛出了一个throw异常的时候,如果该函数内部构造了对象的话,系统会先对该对象调用析构函数,当对象调用完了析构函数以后,才开始执行异常的抛出工作。

同时在具有继承关系的类的异常中,子类的异常应该放在前面,而基类的异常应该放到最后面,这样可以使子类的异常先获得处理,父类的异常最后处理。

  1. [cpp] view plaincopyprint? #include<iostream>     using namespace std;    class X    {    public:     class Trouble {};   //注意:类中嵌套类的申明和定义,学习!!!       class small: public Trouble {};      class big:public Trouble {};//类中的继承!!!      void f(){     throw big();     }    };    int main()    {      X x;     try{       x.f();      }     catch(X::Trouble &)      {       cout<<"caught Trouble"<<endl;      }      catch(X::small&)      {        cout<<"caught small"<<endl;    }      catch(X::big&)      {      cout<<"caught big"<<endl;      }       return 0;    }

    如果这样的话,抛出的big()类型异常则被trouble类垄断,应该倒着写才可以实现顺序捕获所有异常,另外使用...可以捕捉所有的异常,这个应该放到最后面才可以。

省略号异常处理器不允许接受任何参数,所以无法得到任何相关异常的信息,也无法知道异常的类型,这种catch语句经常用于清理资源并重新抛出所捕获的异常。

相关推荐:

异常处理实例用法

nginx+php-fpm出现502 bad gateway异常解决办法

以上就是C++异常处理:系统函数terminate的调用的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:C++的可移植性和跨平台开发(长文)

相关资讯