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


本文摘自网络,作者php是最好的语言,侵删。

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

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

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

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [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

    }

terminate被调用的情况:

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

  1. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    [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. 1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    [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的调用的详细内容!

相关阅读 >>

C++用什么软件编程

C++隐式类型转换是什么?

C++中static关键字的作用是什么?

dev C++怎么改成中文

C++输出二维字符矩阵对齐

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

C++ vector用法详解

C++异常处理的方法

C++语言标识符的命名规则是什么?

区分C++常量表达式、const、constexpr(附代码)

更多相关阅读请进入《C++》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...