C 異常處理詳解

2021-08-13 11:48:24 字數 2313 閱讀 2486

捕獲異常:

捕獲異常的語法為:

trycatch(異常型別)

try 和 catch 都是c++中的關鍵字,後跟語句塊,不能省略「」。try 中包含可能會丟擲異常的語句,一旦有異常丟擲就會**獲。從「try」的意思可以看出,它只是「嘗試」捕獲異常,如果沒有異常丟擲,那就什麼也不捕獲。catch 用來處理 try 捕獲到的異常;如果 try 沒有捕獲到異常,就不會執行 catch 中的語句。

異常型別:

所謂丟擲異常,實際上是建立乙份資料,這份資料報含了錯誤資訊,程式設計師可以根據這些資訊來判斷到底出了什麼問題,接下來該怎麼處理。

異常既然是乙份資料,那麼就應該有資料型別。c++規定,異常型別可以是基本型別,也可以是標準庫中類的型別,還可以是自定義類的型別。c++語言本身以及標準庫中的函式丟擲的異常,都是 exception 類或其子類的型別。也就是說,丟擲異常時,會建立乙個 exception 類或其子類的物件。

異常**獲後,會和 catch 所能處理的型別對比,如果正好和 catch 型別匹配,或者是它的子類,那麼就交給當前 catch 塊處理。catch 後面的括號中給出的型別就是它所能處理的異常型別。

例如:#include

using namespace std;

int main()catch(exception e)

trycatch(exception e)

return 0; }

catch 所能處理的異常型別是 exception,at() 函式丟擲的型別是 out_of_range,out_of_range 是 exception 的子類,所以就交給這個 catch 塊處理。

catch 後面的exception e可以分為兩部分:exception 為異常型別,e 為 exception 類的物件。異常丟擲時,系統會建立 out_of_range 物件,然後將該物件作為「實參」,像函式一樣傳遞給「形參」e,這樣,在 catch 塊中就可以使用 e 了。

其實,乙個 try 後面可以跟多個 catch,形式為:

try

catch (exception_type_1)

catch (exception_type_2)

// ……

catch (exception_type_n)

異常**獲時,先和 exception_type_1 作比較,如果異常型別是 exception_type_1 或其子類,那麼執行當前 catch 中的**;如果不是,再和 exception_type_2 作比較……依此類推,直到 exception_type_n。如果最終也沒有找到匹配的型別,就只能交給系統處理,終止程式。

throw:丟擲自己的異常:

throw 是c++中的關鍵字,用來丟擲異常。如果不使用 throw 關鍵字,try 就什麼也捕獲不到;上節提到的 at() 函式在內部也使用了 throw 關鍵字來丟擲異常。

throw 既可以用在標準庫中,也可以用在自定義的函式中,丟擲我們期望的異常。throw 關鍵字語法為:

throw exceptiondata;

exceptiondata 是「異常資料」的意思,它既可以是乙個普通變數,也可以是乙個物件,只要能在 catch 中匹配就可以。

exception類:

c++語言本身或者標準庫丟擲的異常都是 exception 的子類,稱為標準異常(standard exception)。你可以通過下面的語句來匹配所有標準異常:

trycatch(exception &e)

之所以使用

引用

,是為了提高效率。如果不使用引用,就要經歷一次物件拷貝(拷貝物件時要呼叫拷貝建構函式)的過程。

exception 類的直接派生類:

logic_error 的派生類:

runtime_error 的派生類:

異常處理詳解(C )

什麼是異常處理?異常是指程式在執行過程中出現的以外情況。異常通常會使程式的正常流程被打斷。例如,算數運算中被除數為0 陣列下標越界 開啟檔案是檔案不存在等等。一般情況下,程式中需要對異常進行處理,通過對異常情況的處理,可以發現產生異常的原因,並進行必要的異常處理,從而值程式的執行流程繼續走下去。為什...

C 異常處理詳解

異常介紹 www.cppcns.com1 system.exception類 message屬性 發生異常的原因和異常的內容 souce屬性 丟擲異常程式集的名稱 stacktrace屬性 發生異常的方法呼叫情況 innerexception屬性 次異常中包含的異常 2 try catch fina...

C 之異常處理詳解

程式中的錯誤分為編譯時的錯誤和執行時的錯誤。編譯時的錯誤主要是語法錯誤,比如 句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而執行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在呼叫函式...