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