首頁 > 後端開發 > C#.Net教程 > C++異常處理:系統函數terminate的呼叫

C++異常處理:系統函數terminate的呼叫

php是最好的语言
發布: 2018-08-10 15:29:22
原創
2106 人瀏覽過

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;  
    }
    登入後複製

terminate被呼叫的情況:

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的呼叫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板