C++的语句和C语言都基本相同,这里笔记记录在C语言学习中没有学习的try语句。
所以:
try语句块和异常处理
当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。此时,检测出问题的部分应该发出某种信号以表明程序遇到了故障,无法继续下去了,而且信号发出方无需知道故障将在何处得到解决。一旦发出异常信号,检测出问题的部分也就完成了任务。
如果程序中含有可能引发异常的代码,那么通常也会有专门的代码处理问题。例如,如果程序的问题是输入无效,则异常处理部分可能会要求用户重新输入正确的数据;如果丢失了数据库连接,会发出报警信息。
异常处理机制为程序中异常检测和异常处理这两部分的协作提供支持。在C++语言中,异常处理包括:
- throw表达式:异常检测部分使用throw表达式来表达遇到了无法处理的问题,即throw引发了异常
- try语句块:异常部分由try语句块来处理。语句块通常由try开始,由一个或者多个catch字句结束。因为catch字句处理了异常,所以它们也被称为异常处理代码。
- 一套异常类:用于在throw表达式和相关的catch字句之间传递异常的具体信息。
throw表达式
曾经编写代码的过程,我们也使用过if else语句来输出提示。
在真实的程序中,应该把对象相加的代码和用户交互的代码分离开来。此例中,我们改写程序使得检查完成后不再直接输出一条信息,而是抛出一个异常:
if(item1.isbn() != item2.isbn())
throw rentime_error("Data must refer to same ISBN");
cont << item1 + item2 <<endl;
在这段代码中,如果ISBN不一样就抛出一个异常,该异常是类型runtime_error的对象。抛出异常将终止当前的函数,并把控制权转移给能处理该异常的代码。
类型runtime_error是标准库异常类型的一种,定义在stdexcept头文件中。我们必须初始化runtime_error的对象,方法是提供一个string的对象或者C风格的字符串。这个字符串中有一些关于异常的辅助信息。
try语句块
try语句块的通用语法是:
try{
program-statements
}catch(exception-declaration){
handler-statements
}catch(exception-declaration){
handler-statements
}//...
catch字句包括三个部分:关键字catch、括号内一个(可能未命名的)对象的声明以及一个块。catch一旦完成,程序跳到try语句块最后一个catch子句之后的那条语句继续执行。
try语句块中的program-statements组成程序的正常逻辑,像其他任何块一样,program-statements可以有包括声明在内的任意C++语句。try语句块内声明的变量在外部无法访问,在catch子句内也不能。
编写处理代码:
编写一段程序,从标准输入读取两个整数,输入第一个除以第二个的结果,当第二数是0时,抛出异常,使用try语句去捕获异常,询问用户是否重新输入数执行try语句块的内容。
#include<iostream>
#include<stdexcept>
using namespace std;
int main()
{
double num1, num2;
while (cin >> num1 >> num2) {
try {
if (num2 == 0)
throw runtime_error("num2 mustn't be the 0");
cout << num1 / num2 << endl;
}catch (runtime_error err) {
cout << err.what() << "Enter again? Enter y or n" << endl;
char c;
cin >> c;
if (!cin || c == 'n')
break;
}
}
return 0;
}