- 7
- 0
- 约6.2千字
- 约 20页
- 2016-11-28 发布于河南
- 举报
14C工具
* 面向对象程序设计 第十四章 C++工具 * 异常处理 程序的错误有两种:一种是编译错误,即语法错误。另一种是在运行时发生的异常(exception) 。 异常处理机制只处理运行时的差错和其它例外情况,不包括编译错误。 异常是程序可能检测到的,运行时不正常的情况 可以预见可能发生在什么地方,但是无法确知怎样发生和何时发生 异常产生情况:存储空间耗尽、数组越界、被0除等等 * 异常处理 处理异常的流程 函数f()捕获并处理异常 函数h() 引发异常 函数g() …… 调用者 异常传播方向 调用关系 * 异常处理的语法 C++异常处理语句的一般形式 try { //try 块内监视异常 if (条件)throw exception; //由throw 抛出异常 … ; //其它语句 } catch( 类型1 参数1 ) { //catch块内处理代码 } catch( 类型2 参数2 ) { … ; } …… catch( 类型n 参数n ) { … ; } 注意: C++通过try夺取运行期的环境控制权,即异常的引发是由程序员控制的,而不是由程序运行环境或计算机硬件控制的。任何要检测异常的语句或函数调用都必须在try语句块中执行。异常由紧跟在try块后的catch语句来捕获并处理。 * 异常处理的语法 异常处理示例 #includeiostream.h #includemath.h float Div(float x,float y); void main( ) { try { float a=1.0,b; while (a0.0) { cout 请输入被除数:; cin a; cout 请输入除数:; cin b; couta/b=Div(a,b)endl;} } catch (float) { coutdeviding is zero.\n\n; } coutthat is ok.\n; } float Div(float x,float y) { if (fabs(y)0.0001) throw y; return x/y; } * 异常处理 异常处理说明 如果预料某段程序代码有可能发生异常,就将它放在try子句的化括号中。如果这段代码运行时真的遇到异常情况,其中的throw表达式就会抛出这个异常。 出现异常时,try语句块提示编译器到哪里查找catch块,没有紧跟try块的catch块是没有作用的。 当没有发生异常的时候,几乎没有和try块相关的运行时成本。 异常类型说明部分指明该子句处理的异常的类型,它与函数的形参是相似的。可以是某个类型的值,也可以是引用。 如果某个catch语句的参数类型与引发异常的信息数据类型相匹配,则执行该catch语句的异常处理(捕获异常),此时,由throw语句抛出的异常信息(值)传递给catch语句中的参数。 * 异常处理 异常处理说明 被检测的语句必须放在try块中 try语句块必须出现在前,catch紧跟在后。catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。在try{…} 和catch(…){ …}语句之间不得插入任何其它C++语句。 try块和catch块必须用花括号括起来。 一个try-catch结构中只能有一个try块,但可以有多个catch块。 catch后面的圆括号中一般只写异常信息的类型名,但也可以指定变量名。 catch(…)表示捕获任何类型的异常信息。 * 异常处理 异常处理说明 throw抛出异常信息后,首先在本函数中寻找匹配的catch,找不到则转到上一层去处理。 如果throw抛出的异常信息找不到匹配的catch语句,则系统自动调用系统函数terminate终止程序运行。 如果程序内有多个异常处理模块,则当异常发生时,系统自动查找与该异常类型相匹配的catch模块,查找次序为catch出现的次序。需要注意的是catch处理程序的出现顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。 引发异常的throw语句必须在try语句块内,或是由try语句块中直接或间接调用的函数体执行。 exception表示一个异常值,它可以是任意类型的变量、对象或常量。 * 异常处理 异常处理示例 #includeiostream.h const double PI=3.1416; void invoke(int x) {tr
原创力文档

文档评论(0)