该题目主要是为了练习try-throw-catch语句的使用。
首先讲一点理论知识。C++处理异常的机制是由3个部分组成的,即检查(try)、抛出(throw)和捕捉(catch) 。把需要检查的语句放在try块中,throw用来当出现异常时抛出一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。
总结一下如何进行异常处理:
①把可能出现异常的、需要检查的语句或程序段放在try后面的花括号中;
②程序开始运行后,按正常的顺序执行到try块,开始执行try块中花括号内的语句。如果在执行try块内的语句过程中没有发生异常,则catch子句不起作用,流程转到catch子句后面的语句继续执行;
③如果在执行try块内的语句过程中发生异常,则throw运算符抛出一个异常信息,throw抛出什么样的数据由程序设计者自定,可以是任意类型的数据(包括自定义类型数据,如类对象)。
④catch块是try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句;
⑤在一个try-catch结构中,可以只有try块而无catch块;一个try-catch结构中只能有一个try块,但是可以又多个catch块,以便与不同的异常信息匹配;
⑥try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号;
⑦catch后面的圆括号中,一般只写异常信息的类型名。
附上代码:
// primer_5_6_3.cpp : Defines the entry point for the application.
// 编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果
// 当第二个数是0时抛出异常,使用try语句去捕获异常
// catch子句应该为用户输出一条提示信息,询问其是否输入新数并执行try语句块内容
#include "stdafx.h"
#include<iostream>
using namespace std;
int main()
{
int a,b;
double result;
cout << "input the divider and dividend: " << endl;
while(cin >> a >> b)
{
try //将需要被检查的内容放进try语句内
{
if(b==0)
throw(b); //抛出异常
}
catch(int) //catch后的括号内一般只写异常信息的类型名,因为抛出的b为int类型,因此此括号内填入int
{
cout << "wrong! the dividend is 0." << endl; //告诉用户被除数为0
cout << "try again? enter y or n." << endl; //问用户是否要重新输入
char c; //定义一个字符变量,用来接收用户命令,y或者n
cin >> c; //接收用户输入的命令字符
if(c=='y') //如果用户输入y
{
cout << "input the divider and dividend: " << endl; //输出提示语
continue; //跳过下面while循环内的语句,重新执行while循环
}
if(c=='n') //如果用户输入n
break; //退出while循环
}
result = double(a)/double(b); //计算除法结果
cout << a << '/' << b << " = " << result << endl; //输出结果
cout << "input the divider and dividend: " << endl; //作为while条件语句的提示语
}
cout << "exit!" << endl;
system("pause");
return 0;
}
思路不难,注释也比较详细,不过result = double(a)/double(b);可能不太理解为什么要用强制转换。因为题目要求的是输入整数,但是做除法的时候如果是整数相除,那么得到的就会是整数部分结果,例如 4/5,结果就是0。因此为了满足题目要求,且结果比较准确,做除法的时候将除数和被除数强制转换成了double类型。
也顺带熟悉一下continue和break的使用。这里再介绍一下这两个语句:
continue:终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do while循环的内部,或者嵌套在此类循环里的语句或块的内部。
break:负责终止离他最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。注意,break语句只能出现在迭代语句或者switch语句内部。
最后,程序运行效果如下:
尝试了三种情况:
①除数和被除数均满足条件;
②被除数为0,继续输入;
③被除数为0,不继续输入;
针对这三种情况,程序均给出了正确的反应。
不过,真实情况远不止这么简单,用户或许会输入小数、字母等等非int数据,因此我们需要考虑到用户的各种非法输入并准备多个catch子句来处理相应情况,有兴趣的可以改进程序。