溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++程序運(yùn)行時(shí)異常處理是怎樣的

發(fā)布時(shí)間:2021-11-30 16:45:03 來(lái)源:億速云 閱讀:200 作者:iii 欄目:編程語(yǔ)言

這篇文章主要介紹“C++程序運(yùn)行時(shí)異常處理是怎樣的”,在日常操作中,相信很多人在C++程序運(yùn)行時(shí)異常處理是怎樣的問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”C++程序運(yùn)行時(shí)異常處理是怎樣的”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

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

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

try {  被檢查語(yǔ)句  throw 異常  }  catch(異常類型1)  {  進(jìn)行異常處理的語(yǔ)句1  }  catch(異常類型2)  {  進(jìn)行異常處理的語(yǔ)句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 {//被檢查的語(yǔ)句  std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;  std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;  }  catch(int)//異常類型  {  std::cout<<"除數(shù)為0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語(yǔ)句  }  catch(double)//異常類型  {  std::cout<<"除數(shù)為0.0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語(yǔ)句  }  return0;  }

結(jié)果:

C++程序運(yùn)行時(shí)異常處理是怎樣的

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

C++程序運(yùn)行時(shí)異常處理是怎樣的

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

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

***還是一樣,我將用一個(gè)示例來(lái)總結(jié)一下今天所講的內(nèi)容(開(kā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 {//被檢查的語(yǔ)句  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,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語(yǔ)句  }  catch(double)//異常類型  {std::cout<<"除數(shù)為0.0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語(yǔ)句  }  }  return0;  }

結(jié)果:

C++程序運(yùn)行時(shí)異常處理是怎樣的

到此,關(guān)于“C++程序運(yùn)行時(shí)異常處理是怎樣的”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI