寫出乙個bug的程式,是每個程式猿的美好期望,但是現實總是很殘酷,我曾聽到過一句話—–大多數程式猿往往花三分之一的時間寫程式,剩下的三分之二用於修bug,那麼怎樣我們在程式發生錯誤的時候如何快速定位到錯誤**區,從而解決錯誤這就要用的異常處理機制了。
異常處理
當乙個函式發現自己無法處理的錯誤時丟擲異常,讓函式的呼叫者直接或異常分類間接的處理這個問題
編譯錯誤:就是編譯器無法進行繼續編譯的錯誤,最基本的就是語法錯誤了,比如語句後面少了;或者 } 不匹配之類的。編譯錯誤可以由編譯器檢查出來異常的丟擲和捕獲執行時錯誤:分為兩類:1. 由於考慮不周或者輸入錯誤導致程式異常,比如陣列越界訪問,除數為0,堆疊溢位等。 2,由於程式設計思路的錯誤導致程式異常或難以得到預期結果。編譯器對執行時錯誤無能為力,查錯和糾錯完全由使用者自己來完成。
異常處理機制由3個模組組成:try(檢查)、throw(丟擲)、catch(捕獲)異常捕獲的匹配規則:當 throw 丟擲異常時,就會暫停當前函式,先去當前函式裡尋找同型別的catch異常捕獲若匹配成功,則執行catch塊內的異常處理語句,然後接著執行try…catch…塊之後的**。如果在當前的try…catch…塊內找不到匹配該異常物件的catch語句,則由更外層的try…catch…塊來處理該異常;如果當前函式內所有的try…catch…塊都不能匹配該異常,則遞迴回退到呼叫棧的上一層去處理該異常。如果一直退到主函式main()都不能處理該異常,則呼叫系統函式terminate()終止程式。—–棧展開
try 塊裡面丟擲那種型別的異常,則catch裡面捕獲哪種型別的異常,一般情況下,型別必須完全匹配,但以下3種情況可以進行型別轉換:1、允許從非const物件到const的轉換。
即throw1個非const物件,catch1個const物件
2、允許從派生類型別到基類型別的轉換。
即throw1個派生類物件,catch1個基類物件
3、將陣列轉換為指向陣列型別的指標,函式轉換為指向函式型別的指標。
#include
using
namespace
std;
int test2(int a,int b)
return a / b;
}int main()
catch (int b)
異常與建構函式和析構函式
建構函式完成物件的構造和初始化,需要保證不要在建構函式中丟擲異常,否則可能導致物件不完整或沒有完全初始化自定義異常型別析構函式主要完成資源的清理,需要保證不要在析構函式內丟擲異常,否則可能導致資源洩漏(記憶體洩漏、控制代碼未關閉等)
exception類是c++定義的乙個標準異常的類,通常我們通過繼承exception類定義合適的異常類
異常的優點
1.可以清晰的展示出錯誤原因,不像返回錯誤碼那麼模糊異常的缺點:2.許多c++第三方庫使用異常,因此容易與這些結合使用
3.在測試框架裡使用比較方便
打斷執行流 不方便跟蹤**異常安全問題
導致效能下降
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 捕獲型...