日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++程序運(yùn)行時的異常處理

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

站在用戶的角度思考問題,與客戶深入溝通,找到香格里拉網(wǎng)站設(shè)計與香格里拉網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋香格里拉地區(qū)。

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

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

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

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

 
 
 
  1. #include "stdafx.h"  
  2. #include   
  3. template   
  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<
  16. }  
  17. catch(double)//異常類型  
  18. {  
  19. std::cout<<"除數(shù)為0.0,計算錯誤!"<
  20. }  
  21. return0;  

結(jié)果:

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

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

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

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

 
 
 
  1. #include "stdafx.h"  
  2. #include   
  3. template   
  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<
  16. throw;//拋出當(dāng)前處理異常信息給上一層catch  
  17. }  
  18. catch(int)//異常類型  
  19. {  
  20. std::cout<<"除數(shù)為0,計算錯誤!"<
  21. }  
  22. catch(double)//異常類型  
  23. {std::cout<<"除數(shù)為0.0,計算錯誤!"<
  24. }  
  25. }  
  26. return0;  

結(jié)果:


新聞標(biāo)題:C++程序運(yùn)行時的異常處理
網(wǎng)頁地址:http://www.dlmjj.cn/article/djodgis.html