C面向对象程序设计异常处理课件_第1页
C面向对象程序设计异常处理课件_第2页
C面向对象程序设计异常处理课件_第3页
C面向对象程序设计异常处理课件_第4页
C面向对象程序设计异常处理课件_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

1、C面向对象程序设计异常处理1 C+面向对象程序设计 第1章 C+概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C+的标准模板库STL 第11章 输入输出流 第12章 异常处理 C面向对象程序设计异常处理2 第12章 异常处理 12.1 异常处理的概念 12.2 C语言处理异常的方法 12.3 C+语言的异常处理方法 12.4 异常类和C+标准异常 C面向对象程序设计异常处理3 12.1 异常处理的概念 异常(Exception) 是程序

2、可能检测到的 运行时刻不正常的情况。 最常见的异常包括 除数为0,数组越界访问,磁盘或者光盘读写 失败,无效数据,内存耗尽,网络不通等。 异常总是代表着某些不该发生的事情发生 了 C面向对象程序设计异常处理4 异常错误 在程序运行阶段由于系统异常原因而 产生的错误称为异常错误异常错误 异常错误与程序设计错误是两码事 C面向对象程序设计异常处理5 异常错误与程序设计错误 程序设计错误程序设计错误是指程 序员在设计程序时由 于人为因素所产生的 错误。 异常错误异常错误是在程序运 行时由于系统异常原 因而产生的,不是程 序员的失误所致。 如果不排除程序设计程序设计 错误错误,程序就不能通 过编译检查

3、或运行结 果不对。 如果不处理异常错误异常错误, 程序执行时遇到异常 情况就会突然终止或 失控,使用户感到莫 名其妙。 C面向对象程序设计异常处理6 一个异常错误的例子 #include #include using namespace std; int main(int argc, char * argv) ifstream source(argv1); /打开文件 char line128; while(!source.eof() source.getline(line, sizeof(line); cout line endl; source.close( ); return 0; C面

4、向对象程序设计异常处理7 异常处理 异常处理即异常错误处理 异常处理的任务就是使程序的运行过程能 从异常错误中恢复过来继续执行 或者通知用户遇到了何种异常,不得不停 止执行。 Improved error recovery is one of the most powerful ways you can increase the robustness of your code. robustness 鍵壯性,穩固性,穩健性,堅固性 C面向对象程序设计异常处理8 异常处理的例子 int main(int argc, char * argv) ifstream source(argv1); /打开

5、文件 char line128; if(source.fail( ) cout error opening the file argv1 endl; exit(1); while(!source.eof() source.getline(line, sizeof(line); cout line endl; source.close(); return 0; 异常处理代码 C面向对象程序设计异常处理9 12.2 C语言处理异常的方法 12.2.1 检查函数的返回值来发现异常错误 12.2.2 使用signal( )和 raise( )函数 12.2.3 使用非局部的跳转Goto函数 C面向对象

6、程序设计异常处理10 12.2.1 检查函数的返回值来发现异常错误 从函数返回出错信息,如果函数的返回值不 便于返回出错信息,就设置一个全局的出错 标志。(标准C提供errno和perror( )来支持这 种方法) 这种方法的缺陷:繁琐 处理异常的代码和正常算法的代码交织在一起, 增加了代码的复杂性,降低了可读性。 程序员很容易忽视函数的返回值。printf( ) 设置全局的出错标志降低了各个模块的独立性。 C面向对象程序设计异常处理11 12.2.2 使用signal( )和 raise( )函数 使用C 语言标准库中的信号处理系统中 的signal( ) 函数和 raise( )函数。 这

7、种方法的缺陷:复杂 程序员需要理解信号产生的机制并安装合适 的信号处理机制。 对于大型项目,不同库之间的信号可能会产 生冲突。 C面向对象程序设计异常处理12 12.2.3 使用非局部的跳转Goto函数 使用C标准库中非局部的跳转函数: setjmp( ) 和longjmp( )。 这种方法的缺陷: 增加了模块之间的耦合性 上述第二和第三种方法的共同缺陷:不 能调用析构函数进行善后处理,不能释 放对象占用的资源。实际上不可能有效 正确地从异常情况中恢复出来。 C面向对象程序设计异常处理13 12.3 C+语言的异常处理方法 C+的异常处理机制的基本思想是将异常 的检测与处理分离。 C+中异常错

8、误处理用try、throw和 catch三个关键字实现 C面向对象程序设计异常处理14 一个异常处理的简单例子 #include using namespace std; int main( ) int m,n; coutmn; try if (n=0) throw 0; cout (m/n)endl; catch(int) coutDivided by 0!endl; return -1; return 0; catch语句捕获一个 整型异常并处理 在try代码块中包 含需要监控的程 序部分 抛出一个整型异常 C面向对象程序设计异常处理15 12.3.1 C+程序处理异常的一般形式 try

9、/ try Block catch (type1 arg) /exception handling for type1 catch (type2 arg) /exception handling for type2 /. catch (typeN arg) /exception handling for typeN C面向对象程序设计异常处理16 try 和 throw 要监控的程序部分必须包含在try代码块中, (在try块中调用的函数也将被监控,参见)。 如果try块中的程序代码发生了异常错误,那 么这个异常将被抛出(使用throw)。 try块中抛出的异常将被紧跟在try语句之后的 ca

10、tch语句捕获。 C面向对象程序设计异常处理17 另一个异常处理的简单例子 int division(int x, int y); int main( ) int m,n; coutmn; try coutdivision(m,n)endl; catch(int) coutDivided by 0!endl; return -1; return 0; int division(int x,int y) if (y=0) throw 0; return x/y; 返回 catch语句捕获一个 整型异常并处理 在try代码块中包 含需要监控的程 序部分 抛出一个整型异常 C面向对象程序设计异常处理

11、18 catch 当在try中的代码抛出一个异常时,它将 被相应的catch语句捕获并处理。 在try语句后面可以有一个或多个catch语 句。 如果在如果在catch语句中指定的数据类型与异语句中指定的数据类型与异 常的类型匹配,那么这个常的类型匹配,那么这个catch语句将被语句将被 执行。执行。 所有其他的catch语句都将被忽略。 C面向对象程序设计异常处理19 catch (续) 当异常信息被捕获时,变量arg将用来接收异常 信息的值。例如: 如果抛出的异常没有与之类型相匹配的catch语 句,那么将发生非正常的程序终止(abnormal program termination )。

12、例如 如果程序中抛出了一个未被处理的异常,系统 将调用C+标准库中的函数terminate( )。 在默认情况下,函数terminate( )将调用abort( ) 函数来终止程序,但如果需要,也可以定制自 己定义的函数来终止程序的执行。 C面向对象程序设计异常处理20 变量arg用来接收异常的值 #include using namespace std; int main( ) int m,n; coutmn; try if (n=0) throw Divided by 0!; cout (m/n)endl; catch(char * arg) coutargendl; return -1;

13、 return 0; 返回 变量arg用来接收 throw抛出的异常值 C面向对象程序设计异常处理21 抛出的异常的值与变量arg类型不配 #include using namespace std; int main( ) int m,n; coutmn; try if (n=0) throw 0; cout (m/n)endl; catch(char * arg) coutargendl; return -1; return 0; 返回 抛出的异常的值与 变量arg类型不配 C面向对象程序设计异常处理22 12.3.2 捕获函数内部抛出的异常 #include using namespace

14、 std; int division(int x, int y); int main( ) int m,n; coutmn; try coutdivision(m,n)endl; catch(int) coutDivided by 0!endl; return -1; return 0; C面向对象程序设计异常处理23 从函数内部抛出异常 int division(int x,int y) if (y=0) throw 0;/异常信息从函数内部抛出 return x/y; C面向对象程序设计异常处理24 12.3.3 多个catch语句 void Xhandler(int test) try

15、if(test) throw test; else throw Value is zero; catch(int i) cout Caught One! Ex. #: i n; catch(char *str) cout Caught a string: ; cout str n; 每个catch语句所能捕获 的异常必须是不同类型 C面向对象程序设计异常处理25 使用多个catch语句(续) int main( ) cout startn; Xhandler(1); Xhandler(2); Xhandler(0); Xhandler(3); cout end; return 0; C面向对象

16、程序设计异常处理26 12.3.4 非正常的程序终止 #include using namespace std; int main( ) int m,n; coutmn; try if (n=0) throw 0; cout (m/n)endl; catch(char * arg)/ 抛出的异常信息的值与形参变量arg类型不配 coutargendl; return -1; return 0; C面向对象程序设计异常处理27 abnormal program termination 执行上面的程序时,如果输入的除数为 零,就会发生程序非正常终止。 执行情况如下: Please input tw

17、o integers: 2 0 abnormal program termination C面向对象程序设计异常处理28 非正常的程序终止 如果抛出的异常没有与之类型相匹配的catch语 句,则该异常信息将被传递到调用该程序模块 的上一级,它的上级捕获到这个异常信息后进 行处理。 如果上一级模块仍然不能处理,就再传递给其 上一级,如此逐级上传,如果到最高一级还无 法处理。那么将发生非正常的程序终止 (abnormal program termination )。 C面向对象程序设计异常处理29 12.3.5 自定义运行终止函数 如果在程序中抛出了一个未被处理的异常 信息,系统将调用C+标准库中

18、的函数 terminate( )。在默认情况下,函数 terminate( )将调用abort( )函数来终止程序。 程序员也可以编写自己的终止函数,然后 通过set_terminate函数传递给异常处理模块, 使系统在找不到相匹配的异常错误处理模 块时调用该函数。 C面向对象程序设计异常处理30 示例:自定义的运行终止函数 #include using namespace std; void myterm() /自定义的运行终止函数 coutThis is my terminater.endl; /.释放程序中申请的系统资源 exit(1); int main() /. try set_te

19、rminate(myterm); /. throw Exception . ; catch(int i) return 0; C面向对象程序设计异常处理31 12.3.6 捕获所有的异常 void Xhandler(int test) try if(test=0) throw test; / throw int if(test=1) throw a; / throw char if(test=2) throw 123.23; / throw double catch(.) / catch all exceptions捕获所有的异常 cout Caught One!n; C面向对象程序设计异常处

20、理32 捕获所有其他的异常 void Xhandler(int test) try if(test=0) throw test; / throw int if(test=1) throw a; / throw char if(test=2) throw 123.23; / throw double catch(int i) / catch an int exception cout Caught i n; catch(.) / catch all other exceptions捕获所有其他的异 常 cout Caught One!n; C面向对象程序设计异常处理33 12.4 异常类和C+标

21、准异常 catch可以捕获任意类型的异常,包括程序员 自己创建的类型。 在实际程序中,大多数异常的类型都是类, 而不是内置数据类型(标准类型)。 为异常定义一个类的最好理由是:我们可以 创建一个类来描述发生的错误信息,而这个 信息可以帮助异常处理模块处理错误。例如: 实际应用中使用的大多数异常类远比 MyException要复杂。 C面向对象程序设计异常处理34 12.4.1 使用异常类 #include #include using namespace std; class MyException public: char str_what80; MyException() *str_wha

22、t = 0; MyException(char *s) strcpy(str_what, s); ; 使用异常类 C面向对象程序设计异常处理35 使用异常类(续) int main() int a, b; try cout a b; if(!b) throw MyException(Cannot divide by zero!); else cout Quotient is a/b n; catch (MyException e) / catch an error cout e.str_what n; return 0; 返回 C面向对象程序设计异常处理36 12.4.2 C+语言中的标准异常 C面向对象程序设计异常处理37 表12.1 C+语言本身抛出的标准异常 标准异常的名字抛出异常的主体对应的头文件 b

温馨提示

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

评论

0/150

提交评论