c++Primer第五版练习 5.23 5.24 5.25
题目:
5.23
编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果。
5.24
修改你的程序,使得当第二个数是0时抛出异常。先不要设定catch子句,运行程序并真的为除数输入0,看看会发生什么?
5.25
修改上一题的程序,使用try语句块去捕获异常。catch子句应该为用户输出一条提示信息,询问其是否输入新数并重新执行try语句块的内容。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int data1,data2;
while(cin>>data1>>data2)
{
try //异常处理
{
if(data2==0)
{
throw runtime_error("除数不能为0\n"); //使用throw检测异常,可以说throw raise 异常
}
cout<<data1/data2<<endl;
}
catch(runtime_error err)
{
cout<<err.what()<<"请重新输入"<<endl;
}
}
return 0;
}
/*一个程序中出现多个异常如何处理*/
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int data1,data2;
while(cin>>data1>>data2)
{
try
{
if(data2==0)
{
throw runtime_error("除数不能为0\n"); //第一个异常:除数为0
}
else if(!(data2>=1&&data2<=9))
{
throw exception("除数不在1到9之间\n"); //第二个异常:除数不在1-9之间 ,自添加,主要是判断多个catch的使用
}
cout<<data1/data2<<endl;
}
catch(runtime_error err)
{
cout<<err.what()<<"请重新输入"<<endl; //前面的err.what()是为了提供关于异常的文本信息
}
catch( exception err )
{
cout<<err.what()<<"请重新输入"<<endl;
}
}
return 0;
}
问题:多个异常的处理
<stdexcept>定义的异常类:
exception 最常见的问题
runtime_error 只有在运行时才能检测出的问题
range_error 运行时错误,生成的结果超出了有意义的值域范围
overflow_error 运行时错误;计算上溢
underflow_error 运行时错误;计算上溢
logic_error 程序逻辑错误
domain_error 逻辑错误: 参数对应的结果值不存在
invalid_argument 逻辑错误: 无效参数
length_error 逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range 逻辑错误:使用一个超出有效范围的值