C++ (14) 異常處理

 

  1. 程序常見的錯誤
    • 語法錯誤/編譯錯誤:好比關鍵字拼寫錯誤,變量名未定義,語句末尾缺乏分好,括號不匹配,不能找到頭文件......
    • 運行錯誤/:程序在運行過程當中出現錯誤:例如除數爲零,訪問地址非法,輸入數據有誤......
  2. 異常處理的方法
    • 若是執行一個函數過程當中出現異常,若是本函數沒有異常處理,就逐級向上拋出一個異常信息。最高一級也沒法處理,最後異常終止程序執行。
    • 異常處理中的三分部分:
      • 檢查:try
      • 拋出:throw
      • 捕獲:catch
    • 異常處理的形式:
      • try-catch結構
        • try
        •     {被檢查的語句或者函數}
        • catch (異常信息類型 [變量名])  // 變量爲可選,用來接受拋出的數據
        •     {進行異常處理的語句}
      • throw語句:
        • throw 數據;  // 放在被檢查的語句或者函數中
      • 注意
        • 被檢查的語句和函數必須放在try模塊中
        • try 和 catch 做爲一個總體出現,中間不能插入其餘語句
        • try 和 catch 模塊必須用花括號括起來
        • 一個 try-catch 結構能夠只有一個try模塊,單能夠有多個catch模塊
        • catch(...):表明捕獲類型未指定,它能夠捕獲任何類型的異常信息
        • 「throw;」 表示"當前try語句不出了這個異常,請上級處理",例如
          • try 
          • {
          •     throw double(2.0);
          • }
          • catch (double)
          • {
          •     throw;
          •     cout << "This sentence will not be printed out!" << endl;
          • }
        • 若是throw拋出的語句找不到與之匹配的catch模塊,那麼系統就會調用terminate函數終止程序
  3. 在函數聲明中進行異常狀況指定
    • 爲了便於閱讀,在聲明函數時列出可能拋出的異常狀況:
      • double triangle(double, double, double) throw(double);
      • double triangle(double, double, double) throw(int, double, float, char);  // 表示能夠拋出四種類型的異常
      • double triangle(double, double, double) throw();  // 聲明一個不拋出異常的函數,即便函數內有throw語句也不執行。
  4. 在異常處理中處理析構函數:
    • 在執行try模塊過程當中發生異常,成員會離開try模塊(若是try模塊中調用函數,則程序先離開該函數,回到try模塊),這樣流程就有可能離開該對象的做用於而轉到其餘函數,於是應當事先作好結束對象前的清理工做。
  5. 舉例:
  6. #include <strstream>
    #include <iostream>
    #include <stack>
    using namespace std;
    
    int main()
    {
        void f1();
    
        try
        {
            f1();
        }
        catch(double)
        {
            cout << "OK0" << endl;
        }
        cout << "end0" << endl;
        return 0;
    }
    
    void f1()
    {
        void f2();
        try{f2();}
        catch(char)
        {
            cout << "OK1" << endl;
        }
        cout << "end1" << endl;
    }
    
    void f2()
    {
        void f3();
        try{f3();}
        catch(int)
        {
            cout << "OK2" << endl;
        }
        cout << "end2" << endl;
    }
    
    void f3()
    {
        double a = 0;
        try
        {
            throw a;
        }
        catch (float)       // 結果OK0 end0
    //    catch (double)    // OK3 end3 end2 end1 end0
        {
            cout << "OK3" << endl;
    //        throw;    // 將a直接拋出,最後結果 OK3 OK0 end0
        }
        cout << "end3" << endl;
    }
    View Code
相關文章
相關標籤/搜索