c++ try-catch-throw


《數據結構與算法》用到了錯誤處理ErrorCode,但是書本上的錯誤處理只是返回一個枚舉類型,但是並沒有告訴用戶發生了什么了類型的錯誤。

最近看了啊舟的的一個錯誤處理的代碼,用的是try-catch-throw來處理錯誤,想到自己學得不好所以來重新地學一下。

try-catch-throw

try后面要用花括號括起來一段代碼塊block1,catch后面要用花括號括起來一段代碼塊block2。throw 拋出的是一個類型。

首先“嘗試”執行block1中的代碼,嘗試過程中是一直被監視的,一旦catch到了一個throw出來的錯誤信息,那么try就停止執行,但是try語句塊前面執行過的依然算數。

若block1里面的代碼全部執行完畢之后都沒有catch到錯誤信息,那么就跳過block2的代碼。

一旦catch到了錯誤信息,那么就要執行block2當中的代碼,同時還得在catch關鍵字后面的括號里提出需要捕獲的throw出來的東西的數據類型。

如:catch (char* s)             

//ps1:圓括號里面的數據類型要與throw出的數據類型相同,否則代碼執行過程中會出現錯誤

//ps2:圓括號里面不能為空,否則編譯器會報錯(你得告訴計算機需要捕獲一個什么樣的錯誤類型)

throw 后面直接加變量就行了,如:throw "bad hmean() arguments:a=-b not allowed";

//ps:throw代碼可以在try內執行,也可以在try里面的一個函數里面被拋出

計算調和平均數的代碼

/try測試

#include<iostream>
using namespace std;
double hmean(double a,double b)
{
    if(a==-b)
    {
        throw "bad hmean() arguments:a=-b not allowed";
        cout<<"throw之后還執行"<<endl;
    }
    return 2.0*a*b/(a+b);
}
int main()
{
    double x,y,z;
    int a=1;
    cout<<"輸入兩個數字:";
    while(cin>>x>>y)
    {
        try
        {
            a+=2;
            cout<<"前面執行過的東西"<<endl;
            z=hmean(x,y);
            a++;
        }
        catch (char* s)
        {
            cout<<s<<endl;
            cout<<"輸入一對新的數字:";
            continue;
        }
        cout<<"調和均值是"<<z<<endl;
        cout<<"輸入另外兩個數字,按q退出";
    }
    cout<<endl<<"a="<<a<<endl;
    return 0;
}

測試結果:

 

 同時,catch接受的錯誤類型還可以是enum類型

/try_enum測試

#include<iostream>
using namespace std;
enum ErrorCode{error_A,error_B};
int main()
{
    int x,y,z;
    cout<<"輸入兩個數字:";
    cin>>x>>y;
    try
    {
        if(x==y)
            throw error_A;
        if(x>y)
            throw error_B;
        cout<<x+y<<endl;
    }
    catch(ErrorCode e)
    {
        if(e==error_A)
            cout<<"輸入的兩個數字相等"<<endl;
        else if (e==error_B)
            cout<<"輸入的第一個數字比第二個數字要大"<<endl;
    }
    return 0;
}

測試結果:

 

 

 

以后就可以在一個頭文件里面放自己的錯誤處理代碼,可以真正的做到錯誤處理,比書本上的好多了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM