一 異常處理
異常捕獲是我們在做工程過程中用到的常規手段之一,有很多博友都有過很好的探討,如下
https://blog.csdn.net/weixin_34291004/article/details/92389603
https://www.cnblogs.com/MrYuan/p/4800257.html
二. 探討重點(在寫demo過程中遇到一個try catch失效的問題)
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 }
上述代碼沒法捕獲異常,
而下面的是可以的
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(…)能夠捕獲多種數據類型的異常對象,所以它提供給程序員一種對異常對象更好的控制手段,使開發的軟件系統有很好的可靠性。因此一個比較有經驗的程序員通常會這樣組織編寫它的代碼模塊
1 void Func() 2 { 3 try 4 { 5 // 這里的程序代碼完成真正復雜的計算工作,這些代碼在執行過程中 6 // 有可能拋出DataType1、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中可能拋出的DataType1、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 }
