C 中的異常

2021-10-05 12:09:36 字數 3224 閱讀 8894

傳統的異常處理方式:

1、終止程式,比如assert

2、返回錯誤碼,需要程式設計師去查對應的錯誤碼

3、c標準庫中setjmp和longjmp組合

異常是一種處理錯誤的方式,當函式發現自己無法處理的錯誤就可以丟擲異常,讓函式的呼叫者來處理這個錯誤

throw:用throw丟擲異常

catch:用catch來捕獲異常乙個throw可以有多個catch進行捕獲

try:try塊中的**標識將被啟用的特定異常,後面跟著乙個或多個catch塊

注意:

1.try catch不分家,catch可以用…接收任意型別的異常.

2.throw出的錯誤可以在catch中捕獲.進行對應處理,一般來說,throw出的變數的型別和catch出的型別必須完全匹配,子類的物件可以被父類的物件捕獲.

3.在某個棧中丟擲的錯誤可以由它的上一層棧(呼叫者)進行處理.

#include using namespace std;

int main()

catch (exceptionname e1)

catch (exceptionname e2)

catch (exceptionname en)

system("pause");

return 0;

}

1、異常是通過丟擲物件而引發,通過物件的型別來決定啟用哪個catch

2、被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那乙個

3、丟擲異常物件後,會生成乙個異常物件拷貝,因為丟擲的異常物件可能是乙個臨時物件,所以會生成乙個拷貝物件,這個拷貝的臨時物件會在被catch以後銷毀

4、catch()可以捕獲任意型別的異常,問題是不知道異常錯誤是什麼

5、實際中丟擲和捕獲的匹配原則有例外,並不是型別完全匹配,可以丟擲的派生類物件,使用基類捕獲。

函式呼叫鏈中異常棧展開匹配原則

1、首先檢查throw本身是否在try塊內部,如果是再查詢匹配的catch語句,如果有匹配的,則調到catch的地方進行處理

2、沒有匹配的catch則退出當前函式棧,繼續在呼叫函式的棧中進行查詢匹配的catch

3、如果到達main函式的棧,依舊沒有匹配的,則終止程式

4、找到匹配的catch子句並處理以後,會繼續沿著catch子句後面繼續執行

#include using namespace std;

double division(int a, int b)

else }

void func()

int main()

catch (const char* errmsg)

catch (...)

system("pause");

return 0;

}

乙個catch不能完全處理乙個異常,在進行一些校正處理後,希望再交給更外層的呼叫鏈函式來處理,catch則可以通過重新丟擲將異常傳遞給更上層的函式進行處理

#include using namespace std;

double division(int a, int b)

else }

void func()

catch (...)

cout << "delete" << array << endl;

delete array;

}int main()

catch (const char* errmsg)

system("pause");

return 0;

}

5.1、自定義異常

通過一套繼承的規範體系,丟擲派生類物件,捕獲乙個基類物件就可以

catch (const exception& e)//這裡只需要捕獲基類異常就可以

catch (...)

system("pause");

return 0;

}5.2、標準庫異常

c++t提供了一系列標準的異常,它們是以父子類層次結構組織起來的

c++標準庫的異常類層次結構

#include #include using namespace std;

int main()

catch (const exception& e)

catch (...)

system("pause");

return 0;

}

6.1、異常安全

建構函式不要丟擲異常,否則導致物件不完整或者沒有完全初始化

析構函式不要丟擲異常,否則導致資源洩漏

new和delete之間拋異常會導致記憶體洩漏,lock和unlock拋異常會導致死鎖

6.2、異常規範

可以在函式後面接throw(型別)來列出這個函式可能丟擲的所有異常

函式後面接throw()可以不拋異常

若無異常介面宣告,則次函式可以拋任何型別異常

7.1、異常的優點

1、相比錯誤碼,可以更清晰準確的展示出錯誤資訊,幫助定位錯誤

2、第三方庫包含異常,使用方便

3、更好的進行白盒測試

7.2、異常的缺點

1、異常會導致程式執行流亂跳,除錯困難

2、異常會有效能開銷

3、導致記憶體洩漏和死鎖

4、異常體系混亂

異常 C 中的異常

本文參照於狄泰軟體學院 c 深度剖析課程 之前我們分析了c語言中異常處理的方式,基本沒有好的解決方案。那麼c 中會如何優化c語言對異常的處理的缺陷呢?c 內建了異常處理的語法元素try catch try語句處理正常 邏輯 catch語句處理異常情況 try語句中的異常由對應的catch語句處理 t...

C 中的異常

一,異常的推演 1.函式與異常 平時我們在函式中出現異常情況時通常通過return終止函式並返回乙個值,然後在函式上層來獲取值並判斷是什麼異常情況。因為函式是棧結構的,所以return的時候是通過棧結構逐步往上的,不能夠跨函式直接丟擲,不方便。所以c 推出了異常機制,通過異常機制我們可以輕鬆的捕獲要...

c 中的異常

乙個簡單的例子 include using namespace std double division int a,int b return a b int main catch const char msg return 0 上面的const char 異常型別也可以是任何型別,比如double,...