傳統的異常處理方式: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、異常是通過丟擲物件而引發,通過物件的型別來決定啟用哪個catch2、被選中的處理**是呼叫鏈中與該物件型別匹配且離丟擲異常位置最近的那乙個
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++標準庫的異常類層次結構
6.1、異常安全#include #include using namespace std;
int main()
catch (const exception& e)
catch (...)
system("pause");
return 0;
}
建構函式不要丟擲異常,否則導致物件不完整或者沒有完全初始化7.1、異常的優點析構函式不要丟擲異常,否則導致資源洩漏
new和delete之間拋異常會導致記憶體洩漏,lock和unlock拋異常會導致死鎖
6.2、異常規範
可以在函式後面接throw(型別)來列出這個函式可能丟擲的所有異常
函式後面接throw()可以不拋異常
若無異常介面宣告,則次函式可以拋任何型別異常
1、相比錯誤碼,可以更清晰準確的展示出錯誤資訊,幫助定位錯誤7.2、異常的缺點2、第三方庫包含異常,使用方便
3、更好的進行白盒測試
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,...