标签:div gic under runtime flow 部分 拷贝 hand sed
一、关键点
异常:存在于运行时的反常行为,这些行为超出了函数正常功能的范围。
典型的异常:失去数据库连接、遇到意外输入等。
异常处理机制:为程序中异常检测和异常处理这两部分的协作提供支持。
二、异常检测
形式:throw 表达式;
解释:上面的语句将引发一个异常,其中表达式的类型就是抛出的异常类型。
示例:throw runtime_error("自定义提示语"); //类型runtime_error就是一种异常类型
类型runtime_error:是标准库异常类型中的一种,定义在stdexcept头文件中。我们必须初始化runtime_error的对象,方式是给它提供一个string对象或一个字符串字面值,这个字符串主要写一些关于异常的辅助信息。
三、异常处理
1. try语句块
语法形式:
try { program-statements } catch (exception-declaration) { handler-statements } catch (exception-declaration) { handler-statements } // ...
解释:try语句块中的program-statements组成程序的正常逻辑,像其他任何块一样,program-statements可以有包含声明在内的任意C++语句。只是在try语句块内声明的变量在块外无法访问,即使是catch子句也无法访问。
2. catch子句
包括三部分:关键字catch、括号内一个(可能未命名的)对象的声明(称作异常声明)、一个语句块
多个catch子句:当选中了某个catch子句处理异常之后,执行与之对应的块。
catch子句完成:程序跳转到最后一个catch子句之后的那条语句继续执行。
四、寻找处理代码的辛酸过程
1. try语句块可能调用了包含另一个try语句块的函数:使得程序在遇到抛出异常的代码前,其执行路径可能已经经过了多个try语句块。
2. 寻找处理代码的过程:当异常被抛出时,程序首先搜索抛出该异常的函数,如果在当前函数没找到匹配的catch子句,就终止该函数,并在调用该函数的函数中继续寻找。
3. 标准库函数terminate:程序最终都没找到匹配的catch子句,就执行该函数让程序非正常退出。
4. 没有定义try语句块:此时发生异常,系统会调用terminate函数并终止当前程序的执行。
五、异常类
1. 作用:报告标准库函数遇到的问题,异常类也可以用在用户编写的程序中。
2. 定义异常类的4个头文件:
头文件名称 | 说明 |
exception | 定义了最通用的异常类exception,它只报告异常的发生,不提供任何额外信息 |
stdexcept | 定义了几种常用的异常类:exception、runtime_error、range_error等 |
new | 定义了bad_alloc异常类型 |
type_info | 定义了bad_cast异常类型 |
3. 头文件stdexcept中定义的异常类
异常类 | 错误类型 |
exception | 最常见的问题 |
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时错误:生成的结果超出了有意义的值域范围 |
overflow_error | 运行时错误:计算上溢 |
underflow_error | 运行时错误:计算下溢 |
logic_error | 程序逻辑错误 |
domain_error | 逻辑错误:参数对应的结果值不存在 |
invalid_error | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |
4. 异常类定义的几种运算:创建或拷贝异常类型的对象、为异常类型的对象赋值
5. 不能被提供初始值的对象:exception、bad_alloc、bad_cast对象,它们只能以默认初始化的方式来初始化
6. 不能使用默认初始化的对象:除了上面的对象,其他对象在创建时必须提供初始值(string对象或字符串字面值),该初始值含有错误相关的信息
7. 异常类的成员函数:只有一个名为what的成员函数,该函数返回值是一个const char *(字符串字面值),目的是提供关于异常的一些文本信息。该字符串的内容与异常对象的类型有关,如果异常类型有一个字符串初始值,则what返回该字符串。而对于无初始值的异常类型来说,what返回的内容由编译器决定。
六、示例
题目:编写一个程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果。要求:当第二个数是0时抛出异常,使用try语句块去捕获异常,catch子句应该为用户输出一条提示信息,询问是否输入新数并重新执行try语句块的内容。
代码:
1 #include <iostream> 2 #include <vector> 3 #include <cctype> 4 #include <iterator> 5 #include <stdexcept> 6 #include <string> 7 #include <cstring> 8 9 using std::cin; 10 using std::cout; 11 using std::endl; 12 using std::vector; 13 using std::string; 14 using std::runtime_error; 15 16 int main() 17 { 18 int a, b; 19 reinput: cin >> a >> b; //带标签语句,作为goto的目标 20 try { 21 if (!b) { 22 throw runtime_error("除数不能为0!"); 23 } 24 cout << a / b << endl; 25 } 26 //err是runtime_error类的一个实例 27 catch (runtime_error err) { 28 cout << err.what(); //what是runtime_error类中的成员函数 29 cout << "\n是否需要重新输入? Enter y or n:" << endl; 30 char ch; 31 cin >> ch; 32 if (ch == ‘n‘) 33 cout << "bye!\n"; 34 else 35 goto reinput; //reinput是用于标识一条语句的标识符 36 } 37 return 0; 38 }
七、小结
标签:div gic under runtime flow 部分 拷贝 hand sed
原文地址:http://www.cnblogs.com/xzxl/p/7657649.html