1. 程式人生 > >C++中異常處理

C++中異常處理

異常處理

       try-throw-catch是丟擲和捕捉異常的基本機制,throw語句丟擲異常(一個值),catch塊捕捉異常。丟擲異常後,try塊終止,轉而執行catch塊的程式碼。Catch塊結束後,會據需執行catch塊之後的程式碼(前提是catch塊沒有終止程式或執行另一些特殊操作)。

       如果try塊沒有丟擲異常,在try塊結束後,程式從catch之後的程式碼繼續執行。換言之,如果沒有丟擲異常,catch會被忽略。

  1. 函式h在執行期間發生了故障,導致計算不能進行下去,此時函式h可以不去處理這個異常,可以將異常拋送給呼叫者,比如函式g可能是函式h 的呼叫者,此時函式g可以選擇處理這個異常或者繼續丟擲這個異常,此時異常就可能沿著呼叫棧一級一級向上傳輸,直到某一級函式能夠捕獲並處理這個異常。異常的丟擲方向和函式的呼叫方向正好是相反的。
  2. 例如除0異常

  1. 異常排除後後面的語句就不會執行(7/1的那一句)
catch(…){

         cout<<”Unexplained exception.\n”;

}

在多個try-catch情況下,上述這個異常處理適合放在一組catch塊的末尾,如果打亂順序會導致下面異常不能正常執行

自定義異常類

#include<iostream>

using namespace std;

class NoMilk{

private:

     int number;

public:

     NoMilk(){};

     NoMilk(int num):number(num){};

     int get_number();

};

int NoMilk::get_number(){

     return number;

}

int main(){

     int numbers,milk;

     double dpg;

     try{

          cout<<"Enter number:"<<endl;cin>>numbers;

          cout<<"Enter milk"<<endl;cin>>milk;



          if(milk<=0){

               throw NoMilk(numbers);

          }

          dpg = numbers/static_cast<double>(milk);

          cout<<numbers<<" numbers.\n"<<milk<<" glasses of milk.\n"<<"You have "<<dpg<<endl;

     }

     catch(NoMilk e){

          cout<<e.get_number()<<"number NO Milk"<<endl;

     }

     return 0;

}

異常介面宣告

  • 一個函式顯式宣告可能丟擲的異常,有利於函式的呼叫者為異常處理做好準備

上面fun()後面throw()將準備丟擲的異常全部寫入

在try塊中,發生異常後,後面的語句就不會執行了,直接丟擲異常,離開try塊,流程進入到catch塊,那麼那些已經構造還未被析構的物件會在第一時間自動被析構,這樣就不會造成資源洩漏。

帶析構語義的類的c++異常處理

標準程式庫異常處理

標準異常類的基礎

  • exception:標準程式庫異常類的公共基類。
  • login_error表示可以在程式中被預先檢測到的異常。
    1. 如果小心地編寫程式,這類異常能夠避免。
  • Runtime_error表示難以被預先檢測的異常。