第12章 异常处理.ppt_第1页
第12章 异常处理.ppt_第2页
第12章 异常处理.ppt_第3页
第12章 异常处理.ppt_第4页
第12章 异常处理.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、异常处理,计算机科学与技术学院 曲立平 Email: ,哈尔滨工程大学计算机科学与技术学院,异常(exception)程序运行期出现的问题或错误。 非结构化异常处理: 用 exit (n) 或 return (n)的运行期错误处理机制,具有“一个入口,多个出口”的特点。 结构化异常处理: 积极的运行期问题处理机制。当异常出现后,可按“警告忽略”、“对话补救”或安全退出等模式,使程序可以在对运行条件做出适当安排或改善后继续运行下去。,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,异常处理的基本语法,C+的异常处理的基本思想 将异常的检测与处理分离。 在一个函数体中检测到

2、异常条件满足,但无法确定相应的处理方法时,就引发一个异常,然后由函数的直接或间接调用者处理此异常。 C+的异常处理建立在三个关键字基础之上: try catch throw,哈尔滨工程大学计算机科学与技术学院,C+异常处理语句的一般形式,try/try 块内监视异常 if (条件)throw exception; /由throw 抛出异常 ;/其它语句 catch( 类型1 参数1 ) /catch块内处理代码 catch( 类型2 参数2 ) ; catch( 类型n 参数n ) ; ,注意:任何要检测异常的语句或函数调用都必须在try语句块中执行。异常由紧跟在try块后的catch语句来捕

3、获并处理。,哈尔滨工程大学计算机科学与技术学院,例:异常处理演示,#include using namespace std; const double PI=3.1416; void invoke(int x) try if(x=0) throw x+5; /抛出int型的异常 if(x=1) throw A; /抛出cahr型的异常 if(x=2) throw An apple; /抛出字符串型的异常 if(x=3) throw PI; /抛出double型的异常 catch(int i) coutcatch a integer iendl; catch(char c) coutcatch

4、a char cendl; ,哈尔滨工程大学计算机科学与技术学院,例:异常处理演示,catch(char str10) coutcatch a string strendl; catch(double d) coutcatch a double dendl; void main() invoke(0); invoke(1); invoke(2); invoke(3); ,程序运行结果: catch a integer 5 catch a char A catch a string An apple catch a double 3.1416,哈尔滨工程大学计算机科学与技术学院,编写异常处理代码

5、的规则,可以有数量不限的catch处理程序出现在try块之后,在try 块出现之前不能出现catch块。 在关键字catch之后的圆括号内应包括数据和类型声明。捕获是根据throw exception 语句的异常类型与之匹配来实现的。 如果抛出一个异常,在通往抛出函数的调用链中找不到与之匹配的catch处理程序,运行将以调用系统 terminate() 函数终止。,哈尔滨工程大学计算机科学与技术学院,编写异常处理代码的规则,如果catch中处理程序执行完毕,而无返回或终止指令,将跳过后面的catch块继续执行程序 。 如果throw语句没有被执行,那么catch块将被忽略。 在实际运用中,th

6、row执行前一定有一个条件判断。 throw 抛出的可以是一个常量,也可以是一个变量。 catch在比较类型匹配时并不需要完全相同。被throw抛出的异常的数据类型与catch 处理程序的参数类型进行匹配的过程,由精确匹配和自动数据类型转换的匹配组成。,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,单路捕获,单路捕获 在程序中使用一个catch处理语句来捕获错误。 处理比较简单。,哈尔滨工程大学计算机科学与技术学院,例:单路捕获异常处理,#include #include class CRange int x; public: CRange(int a)x=a; in

7、t get_x()return x; ; class Range: public CRange public: Range(int b):CRange(b); ;,哈尔滨工程大学计算机科学与技术学院,例:单路捕获异常处理,class String char *contents; int length; public: String(char *str) length=strlen(str); contents=new charlength+1; strcpy(contents,str); char,哈尔滨工程大学计算机科学与技术学院,例:单路捕获异常处理,int function(String

8、 ,运行结果: a b c Out of range! function() returns: 100,哈尔滨工程大学计算机科学与技术学院,多路捕获,多路捕获 在程序中使用多个catch处理语句来捕获错误。 程序在出现一个异常时,可以由相应的处理程序进行有针对性的处理。 多路捕获的异常处理比单路捕获更灵活,适用面更广。,哈尔滨工程大学计算机科学与技术学院,多路捕获,多路捕获的一般规则: 如果try块中的一个语句或者在try 块的一个被调函数中的一个语句抛出一个异常,在沿着调用返回时该异常到达第一个catch语句,逐个查看每个catch语句处理程序,找出匹配。 如果找到一个匹配,就执行匹配的处理

9、程序代码。若所有的catch语句都找完了,还没有找到匹配的catch语句,就由调用系统函数terminate()终止调用,后者按常规再调用abort0。,处理程序有一定的先后顺序。,哈尔滨工程大学计算机科学与技术学院,例:多路捕获异常处理,#include #include class String int length; char *contents; public: String()contents=NULL; String(char *str) length=strlen(str); contents=new charlength+1; strcpy(contents,str); cha

10、r* get_str(String ,哈尔滨工程大学计算机科学与技术学院,例:多路捕获异常处理,void f(String ,哈尔滨工程大学计算机科学与技术学院,例:多路捕获异常处理,void main() String s1(Hello!); String s2(Hi!); String s3; f(s1); f(s2); f(s3); ,运行结果: Hello! Hi! content is NULL Caught a known exception.,哈尔滨工程大学计算机科学与技术学院,哈尔滨工程大学计算机科学与技术学院,异常的重抛,同一异常可以多次抛出,在第一次抛出写上异常名,而后只需

11、调用“throw”即可完成重抛。 限制:一个异常只能在一个catch块(或在该块调用的函数)中重抛;再次抛出异常时,不能由同一个catch 块捕获,它将传给外面的try-catch 块处理。,哈尔滨工程大学计算机科学与技术学院,例:异常的重抛,#include void f() try throw Hello; catch(char *str) coutCaught str inside f()endl; throw; /重抛 void main() try f(); catch(char *str) coutCaught str inside main()endl; ,运行结果: Caugh

12、t Hello inside f() Caught Hello inside main(),哈尔滨工程大学计算机科学与技术学院,异常的限制,C+异常机制允许在函数定义后面增加一个抛出类型说明,以限制该函数可以抛出的异常类型。 异常限制的一般格式如下: 返回值类型 函数名() throw () . ,注意:经这样定义的函数,抛出的异常数据只能是异常类型列表中的一种。,哈尔滨工程大学计算机科学与技术学院,例:异常的限制,#include void invoke(int test) throw(int, char) if(test=0) throw test; if(test=1) throw a;

13、 if(test=2) throw 123.23; void f(int t) try invoke(t); catch(int j) coutCaught an integer jendl;,哈尔滨工程大学计算机科学与技术学院,例:异常的限制,catch(char c) coutCaught a char: cendl; catch(double d) coutCaught a double dendl; void main() f(0); f(1); f(2); coutEndendl; ,运行结果: Caught an integer 0 Caught a char: a Abnorma

14、l program terminate,哈尔滨工程大学计算机科学与技术学院,异常成组,异常成组 将多个有某种关联的异常放在一组。这些异常通常属于某一个方面的异常。 在C+异常处理中,有两种方式把多个异常成组 异常枚举成组 异常派生成组,哈尔滨工程大学计算机科学与技术学院,例:异常枚举成组,#include enum errserr0,err1,err2; void f(int test) try if(test=0) throw err0; if(test=1) throw err1; if(test=2) throw err2; catch(errs er) switch(er) case err0:coutCaught err0 exceptionn; brea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论