溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何使用C++異常處理中系統(tǒng)函數(shù)terminate的調(diào)用

發(fā)布時(shí)間:2020-07-16 10:37:31 來(lái)源:億速云 閱讀:238 作者:Leah 欄目:編程語(yǔ)言

如何使用C++異常處理中系統(tǒng)函數(shù)terminate的調(diào)用?針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

                                                           C++中處理異常的過(guò)程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個(gè)錯(cuò)誤信息,把它傳遞給上一級(jí)的函數(shù)來(lái)解決,上一級(jí)解決不了,再傳給其上一級(jí),由其上一級(jí)處理。如此逐級(jí)上傳,直到最高一級(jí)還無(wú)法處理的話,運(yùn)行系統(tǒng)會(huì)自動(dòng)調(diào)用系統(tǒng)函數(shù)terminate,

學(xué)會(huì)使用terminate函數(shù)有助于異常處理

一 當(dāng)一個(gè)異常產(chǎn)生的時(shí)候調(diào)用terminate函數(shù),代碼:

  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;  
    }

terminate被調(diào)用的情況:

1 當(dāng)發(fā)送一個(gè)異常,并且構(gòu)造函數(shù)產(chǎn)生異常
2 當(dāng)發(fā)送一個(gè)異常,或者析構(gòu)函數(shù)產(chǎn)生異常
3 一個(gè)靜態(tài)對(duì)象的構(gòu)造或者析構(gòu)發(fā)送一個(gè)異常
4 以atexit注冊(cè)的函數(shù)發(fā)生異常的時(shí)候
5 自定義一個(gè)異常,但是實(shí)際上沒(méi)有異常產(chǎn)生的時(shí)候
6 調(diào)用缺省的unexcepted()函數(shù)時(shí)候
例子說(shuō)話:

  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(...){  
     }  
    }

    當(dāng)一個(gè)函數(shù)拋出了一個(gè)throw異常的時(shí)候,如果該函數(shù)內(nèi)部構(gòu)造了對(duì)象的話,系統(tǒng)會(huì)先對(duì)該對(duì)象調(diào)用析構(gòu)函數(shù),當(dāng)對(duì)象調(diào)用完了析構(gòu)函數(shù)以后,才開(kāi)始執(zhí)行異常的拋出工作。

同時(shí)在具有繼承關(guān)系的類(lèi)的異常中,子類(lèi)的異常應(yīng)該放在前面,而基類(lèi)的異常應(yīng)該放到最后面,這樣可以使子類(lèi)的異常先獲得處理,父類(lèi)的異常最后處理。

  1. [cpp] view plaincopyprint?
    #include<iostream>    
    using namespace std;   
    class X   
    {   
    public:   
     class Trouble {};   //注意:類(lèi)中嵌套類(lèi)的申明和定義,學(xué)習(xí)!!!    
      class small: public Trouble {};   
      class big:public Trouble {};//類(lèi)中的繼承!!!    
     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()類(lèi)型異常則被trouble類(lèi)壟斷,應(yīng)該倒著寫(xiě)才可以實(shí)現(xiàn)順序捕獲所有異常,另外使用...可以捕捉所有的異常,這個(gè)應(yīng)該放到最后面才可以。

省略號(hào)異常處理器不允許接受任何參數(shù),所以無(wú)法得到任何相關(guān)異常的信息,也無(wú)法知道異常的類(lèi)型,這種catch語(yǔ)句經(jīng)常用于清理資源并重新拋出所捕獲的異常。

關(guān)于如何使用C++異常處理中系統(tǒng)函數(shù)terminate的調(diào)用問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI