###try語句塊#c++
異常處理部分使用try語句塊來處理異常。try語句塊以try關鍵字開始,以一個或多個catch子句結束。try語句塊中,使用throw拋出的異常被catch捕獲並處理。windows
其語法規則爲:數組
try{ program-statements }catch(exception-declaration){ handler-statements }catch(exception-declaration){ handler-statements } //..
其中try語句塊中的program-statements爲正常語句塊,exception-declaration爲異常聲明,handler-statements爲捕獲到異常後的異常處理語句。dom
###throw和catch#函數
C++裏異常有兩種操作系統
一種是CPU發起的(好比非法內存訪問等),強行中斷當前執行的程序,並由運行環境執行適當的應對代碼。 可是在windows環境下,如vc++中,底層直接是用的Win32異常來實現的,因此從操做系統上來看,全是Win32異常,並不會被c++的try/catch捕獲。指針
一種是C++裏用throw語句拋出的異常,這個的結果只是一個單純的跳轉。code
VC++若是編譯的時候加/EHa參數 發生第一種異常的時候能夠用C++的try/catch捕捉。對象
咱們使用throw來拋出異常,用catch來捕獲異常,以下舉例:繼承
double a,b; while (cin<<a<<b){ try{ if (b != 0){ a=a/b; cout<<a<<endl; }else{ throw runtime_error("被0除"); } }catch(runtime_error err){ cout<<err.what()<<"\nTry again?(y or n)"<<endl; char c; cin<<c; if (!cin || c == 'n') break; } }
**棧展開:**若是拋出的異常的函數調用語句位於一個try,則檢查與該try關聯的catch子句,若是找到了匹配的catch,就使用該catch來處理異常,不然若是該try包含在其餘try塊中,則繼續檢查與外層try匹配的catch子句,若是仍沒有,則退出當前主調函數,繼續在調用了該函數的其餘函數中尋找,以此類推。若是最終沒有catch匹配,則調用標準庫函數terminate退出該程序;
**棧展開過程當中對象被自動銷燬:**塊內局部對象會自動銷燬,類類型對象會調用其析構函數;
**catch匹配類型:**容許throw很是量,catch捕獲爲常量;容許throw派生類,catch捕獲爲基類;數組被轉換爲指向數組(元素)類型的指針,函數被轉換成直線該函數類型的指針;包括標準算數類型轉換和類類型轉換在內,其餘全部轉換規則都不能在匹配catch時使用;
**從新拋出:**當一個catch不能完整處理某個異常,能夠將其從新拋出傳遞給另外一個catch語句,從新拋出還是一個throw語句,可是不包括任何表達式:throw;
**catch(...):**當使用catch來捕捉異常時,能夠用catch(...)來捕獲全部的異常。能夠單獨出現,也能夠和其餘的catch語句出現,若是catch(...)和其餘的一塊兒出現,則必須位於最後。
###C++中定義了一些標準異常:#
exception //最多見的問題 runtime_error //只有在運行時才能檢測出的問題 range_error //運行時錯誤:生成計算結果超出了有意義的值域範圍 overflow_error //運行時錯誤:計算上溢 underflow_error //運行時錯誤:計算下溢 logic_error //程序邏輯錯誤 domain_error //邏輯錯誤:參數對應的結果值不存在 invalid_argument //邏輯錯誤:無效參數 length_error //邏輯錯誤:試圖建立一個超出該類型最大長度的對象 out_of_range //邏輯錯誤:使用一個超出有效範圍的值
此外還有