C++中異常處理
阿新 • • 發佈:2018-12-26
異常處理
try-throw-catch是丟擲和捕捉異常的基本機制,throw語句丟擲異常(一個值),catch塊捕捉異常。丟擲異常後,try塊終止,轉而執行catch塊的程式碼。Catch塊結束後,會據需執行catch塊之後的程式碼(前提是catch塊沒有終止程式或執行另一些特殊操作)。
如果try塊沒有丟擲異常,在try塊結束後,程式從catch之後的程式碼繼續執行。換言之,如果沒有丟擲異常,catch會被忽略。
- 函式h在執行期間發生了故障,導致計算不能進行下去,此時函式h可以不去處理這個異常,可以將異常拋送給呼叫者,比如函式g可能是函式h 的呼叫者,此時函式g可以選擇處理這個異常或者繼續丟擲這個異常,此時異常就可能沿著呼叫棧一級一級向上傳輸,直到某一級函式能夠捕獲並處理這個異常。異常的丟擲方向和函式的呼叫方向正好是相反的。
- 例如除0異常
- 異常排除後後面的語句就不會執行(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表示可以在程式中被預先檢測到的異常。
- 如果小心地編寫程式,這類異常能夠避免。
- Runtime_error表示難以被預先檢測的異常。