成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++程序運行時的異常處理

開發 后端
C++開發中最頭疼的就是運行時的異常處理,判斷異常的原因有很多,請看本文為您一一詳解。

  程序中的錯誤分為編譯時的錯誤和運行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什么錯誤。而運行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如內存空間不夠,或者在調用函數時,出現數組越界等錯誤。如果對于這些錯誤沒有采取有效的防范措施,那么往往會得不到正確的運行結果,程序不正常終止或嚴重的會出現死機現象。我們把程序運行時的錯誤統稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機制結構清晰,在一定程度上可以保證程序的健壯性。

  C++中處理異常的過程是這樣的:在執行程序發生異常,可以不在本函數中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到***一級還無法處理的話,運行系統會自動調用系統函數terminate,由它調用abort終止程序。這樣的異常處理方法使得異常引發和處理機制分離,而不在同一個函數中處理。這使得底層函數只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函數去處理。

  C++的異常處理機制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模塊中,檢查語句發生錯誤,throw拋出異常,發出錯誤信息,由catch來捕獲異常信息,并加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。異常處理的一般格式為:

  1.   try 
  2.   {  
  3.   被檢查語句  
  4.   throw 異常  
  5.   }  
  6.   catch(異常類型1)  
  7.   {  
  8.   進行異常處理的語句1  
  9.   }  
  10.   catch(異常類型2)  
  11.   {  
  12.   進行異常處理的語句2  
  13.   }  
  14.   ... 

  下面我們用示例演示一下異常處理:

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. template <typename T>  
  4. T Div(T x,T y)  
  5. {  
  6. if(y==0)  
  7. throwy;//拋出異常  
  8. returnx/y;}  
  9. intmain()  
  10. {  
  11. intx=5,y=0;  
  12. doublex1=5.5,y1=0.0;  
  13. try 
  14. {//被檢查的語句  
  15. std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  
  16. std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  
  17. }  
  18. catch(int)//異常類型  
  19. {  
  20. std::cout<<"除數為0,計算錯誤!"<<std::endl;//異常處理語句  
  21. }  
  22. catch(double)//異常類型  
  23. {  
  24. std::cout<<"除數為0.0,計算錯誤!"<<std::endl;//異常處理語句  
  25. }  
  26. return0;  

  結果:

  看了上述的示例代碼,也許有人會問,第二個雙精度類型的除法計算也應該拋出異常才對啊,在實際的運行過程中并非如此,其實該雙精度類型除法函數根本沒有被執行過。以上程序的執行規程為:調用函數Div(x,y)時發生異常,由函數Div中的語句"throw y"拋出異常,并不在往下執行return x/y,接著catch捕獲int類型的異常并處理異常,***直接執行"return 0"。因此函數Div(x1,y1)和catch(double){}模塊根本沒有被執行。如果,我們把y的值改為1,則結果就變成為:

  如果在執行try語句模塊時,沒有發生異常,則catch語句塊不起作用,流程轉到其后的語句繼續執行。從上述兩個結果中可知***次throw拋出的int類型所以找到處理該類型的catch,而第二次是拋出double類型所找到的是處理double類型的catch。

  下面對異常處理補充幾點:(1)try和catch塊中必須要用花括號括起來,即使花括號內只有一個語句也不能省略花括號;(2)try和catch必須成對出現,一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常信息匹配;(3)如果在catch塊中沒有指定異常信息的類型,而用刪節號"...",則表示它可以捕獲任何類型的異常信息;(4)如果throw不包括任何表達式,表示它把當前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;(5)C++中一旦拋出一個異常,如果程序沒有任何的捕獲,那么系統將會自動調用一個系統函數terminate,由它調用abort終止程序

  ***還是一樣,我將用一個示例來總結一下今天所講的內容(開發工具:vs2010): 

  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. template <typename T>  
  4. T Div(T x,T y)  
  5. {  
  6. if(y==0)  
  7. throwy;//拋出異常  
  8. returnx/y;  
  9. }  
  10. intmain(){  
  11. intx=5,y=1;  
  12. doublex1=5.5,y1=0.0;  
  13. try 
  14. {//被檢查的語句  
  15. std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  
  16. std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  
  17. }  
  18. catch(...)//捕獲任意類型異常  
  19. {  
  20. try 
  21. {  
  22. std::cout<<"任意類型異常!"<<std::endl;  
  23. throw;//拋出當前處理異常信息給上一層catch  
  24. }  
  25. catch(int)//異常類型  
  26. {  
  27. std::cout<<"除數為0,計算錯誤!"<<std::endl;//異常處理語句  
  28. }  
  29. catch(double)//異常類型  
  30. {std::cout<<"除數為0.0,計算錯誤!"<<std::endl;//異常處理語句  
  31. }  
  32. }  
  33. return0;  

  結果:

原文鏈接:http://www.cnblogs.com/CaiNiaoZJ/archive/2011/08/19/2145349.html

責任編輯:彭凡 來源: 博客園
相關推薦

2010-01-27 14:14:48

C++程序運行時間

2024-12-09 13:00:00

C++類型安全

2025-03-03 09:10:00

C++開發

2023-11-21 16:31:51

C++語言

2009-07-20 16:14:39

ASP.NET運行時

2015-07-20 15:44:46

Swift框架MJExtension反射

2024-01-22 13:05:00

C++編程異常處理

2021-03-15 08:33:01

CC++動態庫

2011-12-27 09:39:12

C#運行時

2024-03-21 09:15:58

JS運行的JavaScrip

2020-12-07 13:31:43

GoMutex開發者

2010-01-27 15:36:54

C++異常處理

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運行鏡像開放

2023-08-27 21:07:02

2023-08-21 09:37:57

MySQL工具MariaDB

2024-01-29 08:07:42

FlinkYARN架構

2010-01-27 15:29:45

C++異常處理

2020-07-15 08:11:05

Linuxc++程序

2013-11-26 16:49:55

Android開發運行時KitKat
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产999在线观看 | 国产精品无 | 亚州一区二区三区 | 人人人艹| 亚洲综合大片69999 | 亚洲精品电影在线观看 | 久久精品av麻豆的观看方式 | 久久国产精品久久国产精品 | 日本久草视频 | 亚洲精品99| 大学生a级毛片免费视频 | 人人操日日干 | 超级黄色一级片 | 91久久国产综合久久 | 国产精品一二区 | 免费观看www7722午夜电影 | 国产精品一区二区欧美黑人喷潮水 | 久久人人爽人人爽 | 人操人人 | 最新中文字幕在线 | www.伊人.com| 人妖av| 久久久久九九九女人毛片 | 国产高清精品一区二区三区 | 欧美成视频在线观看 | 天天干天天玩天天操 | 国产伊人久久久 | 红桃视频一区二区三区免费 | 草草视频在线观看 | 欧美国产日韩在线观看成人 | 蜜臀网 | 天天草天天 | 在线视频一区二区三区 | 91一区二区 | 日本精品一区二区 | 亚洲激情在线观看 | 91免费在线看 | 亚洲一区二区久久 | 在线精品观看 | 欧美日日 | 亚洲一区二区在线 |