溫馨提示×

溫馨提示×

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

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

C++‘異常’處理機(jī)制

發(fā)布時(shí)間:2020-07-08 22:56:06 來源:網(wǎng)絡(luò) 閱讀:543 作者:無心的執(zhí)著 欄目:編程語言

        在C++的發(fā)展過程中,為了實(shí)際的需要,引入了異常處理機(jī)制。程序中常見的錯(cuò)誤:語法錯(cuò)誤運(yùn)行錯(cuò)誤,語法錯(cuò)誤一般都是在編譯時(shí)候發(fā)現(xiàn)的,編譯器基本上都會(huì)報(bào)出錯(cuò)誤的具體位置,因此這類錯(cuò)誤一般都是比較好修改,運(yùn)行錯(cuò)誤一般不容易進(jìn)行調(diào)試,比如說,程序崩潰(一般是由于棧溢出),運(yùn)行結(jié)果錯(cuò)誤(一般是算法的邏輯結(jié)構(gòu)有問題)、程序非正常終止等現(xiàn)象。C++中引入異常處理(對運(yùn)行時(shí)出現(xiàn)的差錯(cuò)進(jìn)行處理),能夠極大地提高程序的容錯(cuò)能力。


        C++處理異常是利用try(檢查)、throw(拋出)、catch(捕捉)三部分來進(jìn)行處理的,把有可能出現(xiàn)異常的代碼放到try塊中,throw用來拋出一個(gè)異常信息,catch的參數(shù)一般為拋出的信息類型,如果拋出的類型和catch捕捉的類型相同時(shí)候,則就進(jìn)行對應(yīng)的異常處理。


下面是一個(gè)異常處理的例子:

#include <iostream>
using namespace std;
#include <math.h>
/*定義計(jì)算三角形面積的函數(shù)(利用海倫公式S = sqrt(q*(q - a)*(q - b)*(q - c)),其中q = (a+b+c)/2)滿足三角形的條件:a+b>c  a+c>b  b+c>a(a,b,c都大于0)
*/

double triangle(double a, double b, double c)    
{
     double q = (a + b + c) / 2;
     if (a + b <= c || a + c <= b || b + c <= a)   //a,b,c這三個(gè)長度不能構(gòu)成三角形
     {
          throw a;   //拋出異常
     }
     return sqrt(q * (q - a) * (q - b) * (q - c));   //求三角形面積
}

int main()
{
     double a, b, c;
     cin >> a >> b >> c;
     try    //檢查是否出現(xiàn)異常,異常出現(xiàn)在兩個(gè)方面,一是a,b,c中有可能為負(fù)數(shù),或者兩邊之和不大于第三邊
     {
          while (a > 0 && b > 0 && c > 0)
          {
               cout << triangle(a, b, c) << endl;
               cin >> a >> b >> c;
          }
     }
     catch (double)   //捕捉異常并處理
     {
          cout << a << " " << b << " " << c << "this is not triangle!" << endl;
     }
     system("pause");
     return 0;
}

      

        在上面的例子中,三角形的三邊長度有可能不滿足構(gòu)成三角形的條件,會(huì)發(fā)生異常,try塊中為可能發(fā)生異常的代碼,在triangle函數(shù)中,對三邊的長度進(jìn)行條件的判斷,如果不滿足,則將異常進(jìn)行拋出,這時(shí)程序會(huì)返回主調(diào)函數(shù)中尋找對應(yīng)的catch塊,上面的throw a;a的數(shù)據(jù)類型為double類型,main函數(shù)中catch進(jìn)行捕捉的類型也為double類型,兩者相匹配,就執(zhí)行catch塊中的處理代碼,然后程序不會(huì)返回被調(diào)用函數(shù)拋出的位置,而是直接執(zhí)行catch后面的代碼。


注意:

(1)try塊中的代碼不會(huì)影響原來執(zhí)行的順序,如果try中沒有發(fā)生異常就會(huì)不執(zhí)行catch塊中的代碼,而直接執(zhí)行catch之后的代碼。若出現(xiàn)異常,對異常進(jìn)行拋出,流程會(huì)立即離開本函數(shù),返回上一級(jí)的函數(shù),則不會(huì)執(zhí)行本函數(shù)throw后面的代碼。


(2)流程返回到上一級(jí)函數(shù)時(shí),系統(tǒng)會(huì)尋找與之匹配的catch塊,進(jìn)而執(zhí)行。執(zhí)行完catch塊中的代碼,緊接著執(zhí)行catch塊后面的代碼,直到程序結(jié)束。


(3)被檢測的部分必須放在try塊中,否則會(huì)不起作用。catch塊不能夠單獨(dú)使用,但是try塊可以單獨(dú)使用,但是只進(jìn)行檢查,而不進(jìn)行錯(cuò)誤處理。try和catch塊中必須使用花括號(hào)括起來,哪怕塊中只有一個(gè)語句。一個(gè)程序中只能有一個(gè)try塊,但可以有多個(gè)catch塊,可以進(jìn)行多個(gè)問題的處理。catch只會(huì)檢查參數(shù)的類型,不檢查參數(shù)的值。


(4)若catch(doube b){};   則是將參數(shù)的double類型和throw a;的類型進(jìn)行比較,然后將a的值賦值給b,即就是b=a;

若catch(...){};   則是不論什么類型,都會(huì)執(zhí)行catch塊中的代碼。一般這樣的catch會(huì)放在程序的最后,對于一些意想不到的異常進(jìn)行處理,如果放在最開始則后面的catch就不會(huì)被執(zhí)行。


(5)try-catch可以和throw在同一個(gè)函數(shù)中,也可以不在同一個(gè)函數(shù)中,若不在一個(gè)函數(shù)中,它們的catch執(zhí)行滿足下圖的關(guān)系:

C++‘異常’處理機(jī)制

(6)如果throw的異常信息沒有找到與之相匹配的catch,系統(tǒng)會(huì)自動(dòng)調(diào)用一個(gè)系統(tǒng)函數(shù)terminate函數(shù),使得程序停止運(yùn)行。




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

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

AI