Try Catch C++ 異常捕獲

一 異常處理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     }
View Code

上述代碼無法捕獲異常,.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     }
View Code

兩段代碼的區別是,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 }
相關文章
相關標籤/搜索