C++异常处理机制全解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++异常处理机制全解
▌异常处理(Exception handling)
●返回一个错误码进行异常处理(C语言):
例:
bool func(float a, float b, float& c){
if(b==0){
return false;
}
c=a/b;
return true;
}
int main()
{
float a=10;
float b=0;
float c=0;
bool result=func(a, b, c);
if(!result){
cout<<"The func fails!"< return 0; } else{ cout<<"The func succeeds!"< } //func1(); //func2(); return 0; } ●try-throw-catch语句(C++); 例: void func(float a, float b, float& c){ if(b==0){ //如果b为0,则抛出字符串“Divided by zero!”; throw "Divided by zero"; //throw出来的东西可以是任何类型,甚至可以是类的对象;} c=a/b; } int main() { float a=10; float b=0; float c=0; try{ //测试条件; func(a, b, c); //func1(); //func2(); } catch(const char* str){ //捕获异常信息; cout< } //func4(); return 0; } ★try:诊断异常代码; 例: try{ //可能出现异常的情况 } ☆可能出现异常的三种情况: ①可执行语句; ②一个函数调用; ③一个函数调用另一个函数; ★throw:抛出错误信息; 例: if(分母==0){ throw 参数(只有一个,可以是任何类型,甚至是一个对象) } ★catch:捕获异常信息; 例: catch(参数类型参数){ //只能有一个参数,这里的形参可以被省略,但是省略后不能输出异常信息,依然可以捕获; cout<<参数< } ☆☆☆如果throw抛出了异常,异常类型如果与catch块后面的类型匹配,catch块内的代码将会被执行,在try语句后面可以有多个catch块,程序会寻 找第一个相匹配的catch块,实行catch块的语句代码,然后跳到最后一个catch块的下一行代码,如果没有匹配的catch块,则异常返回上一层try- catch语句,如果没有相应的catch发现,程序将会终结。 ★catch块不能访问try块里面定义的临时变量。 ★try-throw-catch的三种写法: 例: //1 void func(){ float x, num, den; ... //initialize num and den try{ //把操作放到try块里面,不良的写法; if(den==0){ throw "Divided by zero"; } x=num/den; } //... } //2 float divide(float a, float b){ //在函数体中实现操作,推荐写法; if(b==0){ throw "divided by zero"; } return a/b; } void func(){ float x, num, den; //initialize num and den try{ x=divide(num, den); } catch(const char* error){ cout< } //... } //3 float divide(float a, float b){ if(b==0){ throw "divided by zero"; } return a/b; } float middle(float a, float b){ //嵌套写法,推荐写法;return divide(a, b); } void func(){ float x, num, den; //initialize num and den try{ x=middle(num, den); } catch(char* error){ cout< } //... } ▌再次抛出一个异常: 例: #include using namespace std; float divide(int a, int b){ if(b==0){ throw "divided by zero"; } return float(a)/float(b); } float middle(int a, int b){ try{ return divide(a, b); } catch(const char* str){ cout<<"Caught by function middle."< throw str; } }