《数据结构与算法》用到了错误处理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; }
测试结果:
以后就可以在一个头文件里面放自己的错误处理代码,可以真正的做到错误处理,比书本上的好多了。