一 異常處理html
異常捕獲是咱們在作工程過程當中用到的常規手段之一,有不少博友都有過很好的探討,以下程序員
https://blog.csdn.net/weixin_34291004/article/details/92389603安全
http://www.javashuo.com/article/p-rhrpvurf-bq.htmlide
二. 探討重點(在寫demo過程當中遇到一個try catch失效的問題)spa
1 try 2 { 3 char* pch; 4 pch = (char*)00001234; //給予一個非法地址 5 *pch = 6; //對非法地址賦值,會形成Access Violation 異常 6 std::cout << "It is OK !" << std::endl; 7 } 8 catch (const std::exception&) 9 { 10 std::cerr << "catched" << std::endl; 11 }
上述代碼無法捕獲異常,.net
而下面的是能夠的3d
1 try 2 { 3 char* pch; 4 pch = (char*)00001234; //給予一個非法地址 5 *pch = 6; //對非法地址賦值,會形成Access Violation 異常 6 std::cout << "It is OK !" << std::endl; 7 } 8 catch (...) 9 { 10 std::cerr << "catched" << std::endl; 11 }
兩段代碼的區別是,catch (const std::exception&) 和 catch (...)指針
catch(…)可以捕獲多種數據類型的異常對象,因此它提供給程序員一種對異常對象更好的控制手段,使開發的軟件系統有很好的可靠性。所以一個比較有經驗的程序員一般會這樣組織編寫它的代碼模塊code
1 void Func() 2 { 3 try 4 { 5 // 這裏的程序代碼完成真正複雜的計算工做,這些代碼在執行過程當中 6 // 有可能拋出DataType一、DataType2和DataType3類型的異常對象。 7 } 8 catch(DataType1& d1) 9 { 10 } 11 catch(DataType2& d2) 12 { 13 } 14 catch(DataType3& d3) 15 { 16 } 17 /********************************************************* 18 注意上面try block中可能拋出的DataType一、DataType2和DataType3三 19 種類型的異常對象在前面都已經有對應的catch block來處理。但爲何 20 還要在最後再定義一個catch(…) block呢?這就是爲了有更好的安全性和 21 可靠性,避免上面的try block拋出了其它未考慮到的異常對象時致使的程 22 序出現意外崩潰的嚴重後果,並且這在用VC開發的系統上更特別有效,因 23 爲catch(…)能捕獲系統出現的異常,而系統異常每每令程序員頭痛了,現 24 在系統通常都比較複雜,並且由不少人共同開發,一不當心就會致使一個 25 指針變量指向了其它非法區域,結果意外災難不幸發生了。catch(…)爲這種 26 潛在的隱患提供了一種有效的補救措施。 27 *********************************************************/ 28 29 catch(…) 30 { 31 } 32 }