以下**執行環境為64位系統下的vs2013
c++中的異常情況:
語法錯誤(編譯錯誤):比如變數未定義、括號不匹配、關鍵字拼寫錯誤等等編譯器在編譯時能發現的錯誤,這類錯誤可以及時被編譯器發現,而且可以及時知道出錯的位置及原因,方便改正。
執行時錯誤:比如陣列下標越界、系統記憶體不足等等。這類錯誤不易被程式設計師發現,它能通過編譯且能進入執行,但執行時會出錯,導致程式崩潰。
為了有效處理程式執行時錯誤,c++中引入異常處理機制來解決此問題。
c++異常處理機制:
異常處理基本思想:執行乙個函式的過程中發現異常,可以不用在本函式內立即進行處理, 而是丟擲該異常,讓函式的呼叫者直接或間接處理這個問題。
c++異常處理機制由3個模組組成:try(檢查)、throw(丟擲)、catch(捕獲)
丟擲異常的語句格式為:throw 表示式;如果try塊中程式段發現了異常則丟擲異常。
try
catch(型別名[形參名])//捕獲特定型別的異常
catch(型別名[形參名])//捕獲特定型別的異常
catch(…)//捕獲所有型別的異常
棧展開:
有四個函式f1(),f2(),f3(),f4(),在f2()中調f1(),f3調()f2(),f4()調f3(),main()調f4(),並在f1()丟擲乙個異常,在main()用catch語句捕獲。棧展開過程如下:
參考**:
void f1(int i)
void f2()
void f3()
void f4()
int main()
catch (int i)
system("pause");
return
0;}
執行結果:
異常捕獲的匹配規則:
try 塊裡面丟擲那種型別的異常,則catch裡面捕獲哪種型別的異常,一般情況下,型別必須完全匹配,但以下3種情況可以進行型別轉換:
1、允許從非const物件到const的轉換。
即throw1個非const物件,catch1個const物件
2、允許從派生類型別到基類型別的轉換。
即throw1個派生類物件,catch1個基類物件
3、將陣列轉換為指向陣列型別的指標,函式轉換為指向函式型別的指標。
異常的重新丟擲:
void fun(int i)
void fun2()
catch (int i)
}int main()
執行結果:
執行上述**,我們只能知道程式有錯,重新丟擲後,我們不僅知道程式有錯還可以知道錯誤原因,這樣便於及時改正。
參考**如下:
void fun(int i)
void fun2(int i)
catch (int i)
}}int main()
catch (const
char *s)
system("pause");
return
0;}
執行結果:
異常規範:
void fun1()throw(int)//表明只能丟擲int型異常
int main()
編譯時出現警告:忽略異常
2、如果以常規範為throw(),表示不得丟擲任何異常。
異常與建構函式和析構函式:
1、保證不在建構函式中丟擲異常,因為建構函式的作用是構造物件並初始化,一旦丟擲異常,有可能導致物件不完整或沒有完全初始化。
2、保證不在析構函式中丟擲異常,因為析構函式的作用是完成資源的清理,一旦丟擲異常,有可能導致資源洩漏(記憶體洩漏等等)。
c 異常處理機制
c 異常處理機制 c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到...
c 異常處理機制
c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異...
C 異常處理機制
c 異常處理機制主要使用try,throw,catch三大關鍵字。try catch語句形式如下 require redcarpet markdown redcarpet.new hello world puts markdown.to htmltry catch exception1 ex 捕獲型...