关键字有:try,throw,catch。
1. 异常机制提供程序中错误检测与错误处理部分之间的通信。C++ 的异常处理
中包括:
1. throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错
误。可以说,throw 引发了异常条件。
2. try 块,错误处理部分使用它来处理异常。try 语句块以 try 关键字开
始,并以一个或多个catch 子句结束。在 try 块中执行的代码所抛出
(throw)的异常,通常会被其中一个 catch 子句处理。由于它们“处理”
异常,catch 子句也称为处理代码。
3. 由标准库定义的一组异常类,用来在 throw 和相应的 catch 之间传递
有关的错误信息。
2. try 块的通用语法形式是:
try {
program-statements
} catch(exception-specifier) {
handler-statements
} catch(exception-specifier) {
handler-statements
} //...
try 块以关键字 try 开始,后面是用花括号起来的语句序列块。try 块后
面是一个或多个 catch 子句。每个 catch 子句包括三部分:关键字 catch,圆
括号内单个类型或者单个对象的声明——称为异常说明符,以及通常用花括号括
起来的语句块。如果选择了一个catch 子句来处理异常,则执行相关的块语句。
一旦 catch 子句执行结束,程序流程立即继续执行紧随着最后一个 catch 子句
的语句。
3. /*vector<string> name;
string nameTemp;
cout<<"input name whose lengthless than 8"<<endl;
while(cin>>nameTemp){
try{
if(nameTemp.size()>=8)
throwruntime_error("Error!"+nameTemp+"length are more than8bit");
name.push_back(nameTemp);
}
catch(runtime_error err){
cerr<<err.what()<<endl<<"Try again?Y/N"<<endl;
char test;
cin>>test;
if(test!='Y')
break;
else
cout<<"input name whoselength less than 8"<<endl;
}
}
for(vector<int>::size_typei=0;i!=name.size();++i)
cout<<endl<<name[i];
return 0;*/
1. 函数在寻找处理代码的过程中退出:
寻找处理代码的过程与函数调用链刚好相反。抛出一个异常时,首先要搜索
的是抛出异常的函数。如果没有找到匹配的 catch,则终止这个函数的执行,并
在调用这个函数的函数中寻找相配的 catch。如果仍然找到相应的处理代码,该
函数同样要终止,搜索调用它的函数。如此类推,继续按执行路径回退,直到找
到适当类型的 catch 为止。
如果不存在处理该异常的catch 子句,程序的运行就要跳转到名为
terminate的标准库函数,该函数在 exception 头文件中定义。这个标准库函
数的行为依赖于系统,通常情况下,它的执行将导致程序非正常退出。
标准异常
1. exception 头文件定义了最常见的异常类,它的类名是 exception。这个
类只通知异常的产生,但不会提供更多的信息。
2. stdexcept 头文件定义了几种常见的异常类
exception 最常见的问题。
runtime_error 运行时错误:仅在运行时才能检测到问题
range_error 运行时错误:生成的结果超出了有意义的值域范围
overflow_error 运行时错误:计算上溢
underflow_error 运行时错误:计算下溢
logic_error 逻辑错误:可在运行前检测到问题
domain_error 逻辑错误:参数的结果值不存在
invalid_argument 逻辑错误:不合适的参数
length_error 逻辑错误:试图生成一个超出该类型最大长度的对象
out_of_range 逻辑错误:使用一个超出有效范围的值
new 头文件定义了 bad_alloc 异常类型,提供因无法分配内在而由 new
(第 5.11 节)抛出的异常。
type_info 头文件定义了 bad_cast 异常类型,这种类型将第 18.2 节讨
论。
2. 标准库异常类只提供很少的操作,包括创建、复制异常类型对象以及异常类
型对象的赋值。exception、bad_alloc 以及 bad_cast 类型只定义了默认构造
函数(第 2.3.4 节),无法在创建这些类型的对象时为它们提供初值。其他的
异常类型则只定义了一个使用 string 初始化式的构造函数。当需要定义这些异
常类型的对象时,必须提供一想string 参数。string 初始化式用于为所发生
的错误提供更多的信息。
异常类型只定义了一个名为 what 的操作。这个函数不需要任何参数,并且
返回 const char*类型值。它返回的指针指向一个C 风格字符串(第 4.3 节)。
使用 C 风格字符串的目的是为所抛出的异常提出更详细的文字描述。
299
what 函数所返回的指针指向 C 风格字符数组的内容,这个数组的内容依赖
于异常对象的类型。对于接受string 初始化式的异常类型,what函数将返回
该 string 作为 C 风格字符数组。对于其他异常类型,返回的值则根据编译器
的变化而不同。
catch(runtime_errorerr){
cerr<<err.what()<<endl<<"Tryagain? Y/N"<<endl;