Try Catch C++ 異常捕獲


一 異常處理

異常捕獲是我們在做工程過程中用到的常規手段之一,有很多博友都有過很好的探討,如下

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     }
View Code

上述代碼沒法捕獲異常,

而下面的是可以的

 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(…)能夠捕獲多種數據類型的異常對象,所以它提供給程序員一種對異常對象更好的控制手段,使開發的軟件系統有很好的可靠性。因此一個比較有經驗的程序員通常會這樣組織編寫它的代碼模塊

 

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM