《高级语言c++程序设计(第二版)》第十二章 异常处理

上传人:子 文档编号:46790893 上传时间:2018-06-28 格式:PDF 页数:9 大小:31.13KB
返回 下载 相关 举报
《高级语言c++程序设计(第二版)》第十二章 异常处理_第1页
第1页 / 共9页
《高级语言c++程序设计(第二版)》第十二章 异常处理_第2页
第2页 / 共9页
《高级语言c++程序设计(第二版)》第十二章 异常处理_第3页
第3页 / 共9页
《高级语言c++程序设计(第二版)》第十二章 异常处理_第4页
第4页 / 共9页
《高级语言c++程序设计(第二版)》第十二章 异常处理_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《《高级语言c++程序设计(第二版)》第十二章 异常处理》由会员分享,可在线阅读,更多相关《《高级语言c++程序设计(第二版)》第十二章 异常处理(9页珍藏版)》请在金锄头文库上搜索。

1、 * 第十二章 异常处理 1 2 . 1 异常处理的基本思想以及 C + + 实现 程序运行中的某些错误(或意外情况)不可避免但可以预料。如,做除法或模运算时使 用的分母 y 为 0 , 程序中可通过添加如下形式的测试语句来判断是否出现了这种意外情况 (即 异常) , “i f (y = = 0 ) c o u t void main() try /try程序块为“受监控”的块,块中所抛掷的异常 /将被本 try 块后的某一个 catch 块所捕获并处理 int i1, i2; char op; couti1i2op; /输入两个整数 i1、i2 以及一个运算符 op if (op=/) if

2、 (i2=0) /分母为 0 时,抛掷一个字符串 char*类型的异常 throw “Divided by 0!“; /所抛掷的异常将被随后的 catch 块捕获并处理 cout 通过 c a t c h 可构成所谓的 c a t c h 块,它紧跟在 t r y 块的后面,用于监视并捕获运行时可 能出现的某一种类 (类型)的异常并对此种异常进行具体的处理 (处理程序代码包含在c a t c h 块之中) 。即是说,c a t c h程序块将监视并捕获处理程序异常,若没有异常出现的话,c a t c h 程序块将不被执行。若准备处理多种类型的异常的话,要同时给出一个连续的 c a t c h

3、块序列, 届时系统将通过按序逐一“比对”所抛掷的异常类型(既可是系统预定义的基本类型,也可 是用户自定义的某种类型)来确定执行该 c a t c h块序列中的哪一块。c a t c h块的使用格式如 下: c a t c h ( ) 注意,如果 c a t c h 块的具体处理语句序列中根本不使用形参(对应值)的话,则 c a t c h 块首的括号中可以只给出一个异常类型而不必给出形参名字。另外,还允许在c a t c h 块首括 号中仅写上 3 个点符号(即省略号“. . . ” ) ,其使用含义为,该 c a t c h 块将捕获任何类型的异 常。即是说,它与任一种异常类型都可以“匹配”

4、成功。若使用这种c a t c h 块的话,它应该是 c a t c h 块序列的最后一块,否则的话,其后的所有c a t c h 块都将起不到任何作用(永远不 会被“匹配”成功。因为系统是按序与 c a t c h 块序列中的每一块逐一进行“比对”的) 。 抛掷异常的 t h r o w 语句的使用格式为: t h r o w 通常使用“ ”的特殊情况,如,一个变量或对象、一个常量或字符串等。系统 将根据表达式的值类型来与各 c a t c h 块首括号中形参的异常类型进行“比对” ,若“匹配”成 功(要求类型完全一致,系统并不自动进行类型转换) ,则跳转到那一c a t c h 块去执行,

5、即进 行相应的异常处理;若所有匹配都不成功,则将自动去执行一个隐含的系统函数“a b o r t ( ) ” 来终止整个程序的运行。 更确切地说, t h r o w 语句将把运行时遇到的异常事件信息通知给相匹配的异常处理c a t c h 块代码(t h r o w后的“ ”实际上起着实参的作用,它代表的正是异常事件信息,而 c a t c h 块首括号中设立的正是所对应的形参) 。与函数调用类似,通过t h r o w 抛掷异常后,也 同样有一个实参与形参相结合的过程,形实参结合后,c a t c h块中处理的实际上是 t h r o w语 句所提供的实参信息。 但与函数调用不同的是, 函

6、数调用完成后仍要返回到调用处继续执行, 而 t h r o w 语句所进行的“调用”实际上是带有实参的跳转,跳转到的目标是形实参完全匹配 的那一个c a t c h 块, 而执行完c a t c h 块后将不再返回, 继而转到c a t c h 块序列的最后一个c a t c h 块的“下一语句”处去执行。另外注意,c a t c h块必须有且仅允许有一个形参的说明(可以 缺少形参名字,但不可以缺少其类型) ,t h r o w 语句后携带的也只是一个相对应的实参(表达 式) 。 1 2 . 2 多级多层次捕获与处理 C + + 允许使用如下所述的多级多层次的捕获与处理方式。 一是允许抛掷异常

7、的语句处于捕 获与处理异常的 c a t c h 块所在函数的“下属层次” ,例如,可以在主调函数中处理异常,而在 被调函数中抛掷异常。即是说,若在本层次的函数中无法处理所抛掷的异常的话,系统总会 自动沿着“调用链”一直向上传递那一异常。系统将首先找到异常抛掷句t h r o w 所处函数的 “父辈”函数,进一步可能又要去找其“祖辈”函数,如此等等。 二是允许在同一程序中使用多个t r y 块,而且这些 t r y 块可以处于不同的位置并具有不 同的层次级别。抛掷异常后,系统将首先在相应的低层次级别的t r y 后的 c a t c h 块序列中寻 找匹配,若不成功,将自动沿着“调用链”向上传

8、递该异常,并在上一层次的t r y 后的 c a t c h 块序列中继续寻找匹配。直到最终匹配成功,或者已到达了最高层次的m a i n 函数后仍不成功 时,则自动调用系统隐含函数“a b o r t ( ) ”来终止整个程序的运行。 下述程序将对用户提供不恰当输入数据之异常进行处理:输入一个限定范围内的整数, 若输入数据不处于限定范围之内时,则视为程序运行异常,而后抛掷并捕获处理这些异常。 若输入正确,则在屏幕上显示出所输入的整数。另外,在程序中自定义一个异常类 m y E x c e p C l a ,以方便对异常的处理。 对输入数据所限定的范围如下:只允许输入- 5 0 到 5 0 之

9、间除去 0 、1 1 与 2 2 之外的那些 整数之一。具体对异常的处理设定为: 若输入值为 0 ,则抛掷一个“c h a r * ”类异常 显示“m a i n - c a t c h : : E x c e p t i o n : v a l u e e q u a l 0 ! ” ; 若输入值小于- 5 0 ,则抛掷一个自定义类 m y E x c e p C l a 异常 显示“m a i n - c a t c h : : E x c e p t i o n : v a l u e l e s s t h a n - 5 0 ! ” ; 若输入值大于 5 0 ,则抛掷一个“c h a

10、 r * ”类异常 显示“I n D a t a - c a t c h : : E x c e p t i o n : v a l u e g r e a t e r t h a n 5 0 ! ” ; 若输入值为 1 1 ,则利用输入值抛掷一个 i n t 型异常 显示“I n D a t a - c a t c h : : C a u g h t I N T e x c e p t i o n ! i = 1 1 ” ; 若输入值为 2 2 ,则抛掷一个 d o u b l e 型异常 显示“m a i n - c a t c h : : C a u g h t u n k n o w

11、n e x c e p t i o n ! ” 。 要求程序使用两个t r y 块, 一个处于m a i n 函数中, 而另一个则处于被 m a i n 调用的 I n D a t a 函数之中。 它们具有不同的位置并具有不同的层次级别。m a i n 函数中t r y 后的c a t c h 块序 列捕获并处理“c h a r * ” 、 m y E x c e p C l a 以及“其他”任何类型的异常;而 I n D a t a 函数中t r y 后的 c a t c h 块序列则捕获并处理 i n t 与“c h a r * ”类型的异常。 / program 12_2.cpp #in

12、clude #include class myExcepCla /自定义的 myExcepCla 类(类型) char message100; public: myExcepCla(char* msg) /构造函数,实参带来私有字符串数据 message strcpy(message, msg); char* GetErrMsg() /成员函数,获取私有数据 message 字符串 return message; ; void InData(); /函数原型 void main() try /处于 main 中的 try 程序块,它为“受监控”的程序块 InData(); /调用自定义函数 I

13、nData,其中可能抛掷异常 coutval; if (val=0) /若输入值等于 0,抛掷“char*”类异常,在 main 中被捕获处理。 throw “Exception : value equal 0!“; try /处于 InData 中的 try 程序块,它为“受监控”的另一个程序块 if (val50) throw “Exception : value greater than 50!“; /在本 try 后的 catch 块序列中被捕获处理 else f(val); /被调函数 f 中可能抛掷异常 cout #include class ClaA /自定义类 ClaA cha

14、r s100; public: ClaA (char * str) /构造函数,带来私有数据成员 s 字符串的值,并显示构造信息 cout“Constructing ClaA obj - - “strendl; strcpy(s, str); ClaA() /析构函数,显示析构信息 cout“Destructing ClaA obj - - “sendl; ; void main() cout“Begin main function!“endl; try /try程序块为“受监控”的程序块 cout“Enter try- block!“endl; /出现了一个局部块作用域 cout“Begin

15、 a block- statement!“endl; ClaA ob1(“ob1“), ob2(“ob2“); /局部于块的对象 ob1 和 ob2 均被分配在系统的堆栈中 cout“Throwing exception, in block- statement!“endl; throw “throwing char* exception in block- statement!“; /抛掷一个“char*”异常 cout“After throw, in block- statement! End block- statement!“endl; catch (char * str) /捕获“char *”类型的异常并进行处理 cout“In catch- block, deal with: “strendl; cout“Execution resumes here. End main function!“endl; /异常处理结束后,转到此处执行 程序执行后,屏幕显示结果为: Begin main function! Enter try- block! Begin a block- state

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号