這篇文章主要介紹“C++程序運行時異常處理是怎樣的”,在日常操作中,相信很多人在C++程序運行時異常處理是怎樣的問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++程序運行時異常處理是怎樣的”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)專注于隆德網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供隆德營銷型網(wǎng)站建設(shè),隆德網(wǎng)站制作、隆德網(wǎng)頁設(shè)計、隆德網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造隆德網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供隆德網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到***一級還無法處理的話,運行系統(tǒng)會自動調(diào)用系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。這樣的異常處理方法使得異常引發(fā)和處理機(jī)制分離,而不在同一個函數(shù)中處理。這使得底層函數(shù)只需要解決實際的任務(wù),而不必過多考慮對異常的處理,而把異常處理的任務(wù)交給上一層函數(shù)去處理。
C++的異常處理機(jī)制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模塊中,檢查語句發(fā)生錯誤,throw拋出異常,發(fā)出錯誤信息,由catch來捕獲異常信息,并加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。異常處理的一般格式為:
try { 被檢查語句 throw 異常 } catch(異常類型1) { 進(jìn)行異常處理的語句1 } catch(異常類型2) { 進(jìn)行異常處理的語句2 } ...
下面我們用示例演示一下異常處理:
#include "stdafx.h" #include <iostream> template <typename T> T Div(T x,T y) { if(y==0) throwy;//拋出異常 returnx/y;} intmain() { intx=5,y=0; doublex1=5.5,y1=0.0; try {//被檢查的語句 std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl; std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl; } catch(int)//異常類型 { std::cout<<"除數(shù)為0,計算錯誤!"<<std::endl;//異常處理語句 } catch(double)//異常類型 { std::cout<<"除數(shù)為0.0,計算錯誤!"<<std::endl;//異常處理語句 } return0; }
結(jié)果:
看了上述的示例代碼,也許有人會問,第二個雙精度類型的除法計算也應(yīng)該拋出異常才對啊,在實際的運行過程中并非如此,其實該雙精度類型除法函數(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。
下面對異常處理補充幾點:(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):
#include "stdafx.h" #include <iostream> template <typename T> T Div(T x,T y) { if(y==0) throwy;//拋出異常 returnx/y; } intmain(){ intx=5,y=1; doublex1=5.5,y1=0.0; try {//被檢查的語句 std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl; std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl; } catch(...)//捕獲任意類型異常 { try { std::cout<<"任意類型異常!"<<std::endl; throw;//拋出當(dāng)前處理異常信息給上一層catch } catch(int)//異常類型 { std::cout<<"除數(shù)為0,計算錯誤!"<<std::endl;//異常處理語句 } catch(double)//異常類型 {std::cout<<"除數(shù)為0.0,計算錯誤!"<<std::endl;//異常處理語句 } } return0; }
結(jié)果:
到此,關(guān)于“C++程序運行時異常處理是怎樣的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網(wǎng)站名稱:C++程序運行時異常處理是怎樣的
分享URL:http://muchs.cn/article24/piogje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、網(wǎng)站維護(hù)、域名注冊、網(wǎng)站排名、品牌網(wǎng)站建設(shè)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)