16.6 上机实践习题
1.尝试自定义一个对于除法中除数为0或者不是数字的异常抛出,并在上级函数中进行捕获,最后输出异常结果。
【提示】上述题目主要是要求读者熟悉异常机制处理的相关知识,重点是掌握异常机制的概念及其使用。
【关键代码】
01 #include<iostream> 02 #include<cmath>//使用sqrt函数要包含的头文件 03 using namespace std; 04 int calc() 05 { 06 cout<<"请输入被除数和除数:"<<endl; 07 int n=0; 08 int m=0; 09 cin>>n>>m; 10 if(!cin. good())//输入失败 11 { 12 cin. clear();//清除流状态字 13 cin. sync();//清空流缓冲区 14 throw"错误,输入的不是数字";//抛出字符串型异常 15 } 16 if(m==0)//如果num<0,或输入不成功,则抛出字符串类型s 17 throw"错误,除数不能为0";//抛出字符串型异常 18 return n/m; 19 } 20 //主函数处理 21 int res=0; 22 while(true) 23 { 24 try//使用try块标记可能发生异常的代码块 25 { 26 res=calc();//正常的函数调用,如果异常发生,将被抛出 27 } 28 catch(const char*s)//捕获try块中抛出的异常 29 { 30 cout<<s<<endl; 31 continue;//重新循环 32 } 33 cout<<res<<endl;//没有异常发生,输出结果 34 break;//跳出循环 35 }
2.自定义一个terminate函数,并将其设置为默认异常处理函数,最后输出异常结果。
【提示】上述题目主要是要求读者掌握terminate函数的相关知识,重点是掌握terminate函数的概念及其使用。
【关键代码】
01 #include<exception>//必须的头文件 02 #include<iostream> 03 using namespace std; 04 void Ownterminate()//自定义Ownterminate函数 05 { 06 cout<<"严重错误,退出"<<endl; 07 exit(0);//无条件退出 08 } 09 void(*old_terminate)()=set_terminate(Ownterminate);//设置新的Ownteminate函数 10 11 void fun() 12 { 13 throw"error"; 14 } 15 //主函数实现 16 try 17 { 18 fun(); 19 } 20 catch(int x) 21 { 22 cout<<x<<endl; 23 }