C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章 异常处理

上传人:E**** 文档编号:89155605 上传时间:2019-05-19 格式:PPT 页数:42 大小:306.51KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章  异常处理_第1页
第1页 / 共42页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章  异常处理_第2页
第2页 / 共42页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章  异常处理_第3页
第3页 / 共42页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章  异常处理_第4页
第4页 / 共42页
C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章  异常处理_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章 异常处理》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 张德慧 周元哲 主编 第12章 异常处理(42页珍藏版)》请在金锄头文库上搜索。

1、C+面向对象程序设计教学内容,第1章 C+概述 第2章 类和对象 第3章 面向对象程序设计概述 第4章 进一步学习类和对象 第5章 堆与复制构造函数 第6章 继承性:派生类 第7章 运算符重载 第8章 虚函数和多态性 第9章 模板 第10章 类库和C+的标准模板库STL 第11章 输入输出流 第12章 异常处理,第12章 异常处理,12.1 异常处理的概念 12.2 C语言处理异常的方法 12.3 C+语言的异常处理方法 12.4 异常类和C+标准异常,12.1 异常处理的概念,异常(Exception) 是程序可能检测到的运行时刻不正常的情况。 最常见的异常包括 除数为0,数组越界访问,磁盘

2、或者光盘读写失败,无效数据,内存耗尽,网络不通等。 异常总是代表着某些不该发生的事情发生了,异常错误,在程序运行阶段由于系统异常原因而产生的错误称为异常错误 异常错误与程序设计错误是两码事,异常错误与程序设计错误,程序设计错误是指程序员在设计程序时由于人为因素所产生的错误。 异常错误是在程序运行时由于系统异常原因而产生的,不是程序员的失误所致。,如果不排除程序设计错误,程序就不能通过编译检查或运行结果不对。 如果不处理异常错误,程序执行时遇到异常情况就会突然终止或失控,使用户感到莫名其妙。,一个异常错误的例子,#include #include using namespace std; int

3、 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; ,异常处理,异常处理即异常错误处理 异常处理的任务就是使程序的运行过程能从异常错误中恢复过来继续执行 或者通知用户遇到了何种异常,不得不停止执行。 Improved error recovery is one of the most powerful way

4、s you can increase the robustness of your code. robustness 鍵壯性,穩固性,穩健性,堅固性,异常处理的例子,int main(int argc, char * argv) ifstream source(argv1); /打开文件 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; s

5、ource.close(); return 0; ,异常处理代码,12.2 C语言处理异常的方法,12.2.1 检查函数的返回值来发现异常错误 12.2.2 使用signal( )和 raise( )函数 12.2.3 使用非局部的跳转Goto函数,12.2.1 检查函数的返回值来发现异常错误,从函数返回出错信息,如果函数的返回值不便于返回出错信息,就设置一个全局的出错标志。(标准C提供errno和perror( )来支持这种方法) 这种方法的缺陷:繁琐 处理异常的代码和正常算法的代码交织在一起,增加了代码的复杂性,降低了可读性。 程序员很容易忽视函数的返回值。printf( ) 设置全局的出

6、错标志降低了各个模块的独立性。,12.2.2 使用signal( )和 raise( )函数,使用C 语言标准库中的信号处理系统中的signal( ) 函数和 raise( )函数。 这种方法的缺陷:复杂 程序员需要理解信号产生的机制并安装合适的信号处理机制。 对于大型项目,不同库之间的信号可能会产生冲突。,12.2.3 使用非局部的跳转Goto函数,使用C标准库中非局部的跳转函数: setjmp( ) 和longjmp( )。 这种方法的缺陷: 增加了模块之间的耦合性 上述第二和第三种方法的共同缺陷:不能调用析构函数进行善后处理,不能释放对象占用的资源。实际上不可能有效正确地从异常情况中恢复

7、出来。,12.3 C+语言的异常处理方法,C+的异常处理机制的基本思想是将异常的检测与处理分离。 C+中异常错误处理用try、throw和catch三个关键字实现,一个异常处理的简单例子,#include using namespace std; int main( ) int m,n; coutmn; try if (n=0) throw 0; cout (m/n)endl; catch(int) cout“Divided by 0!“endl; return -1; return 0; ,catch语句捕获一个整型异常并处理,在try代码块中包含需要监控的程序部分,抛出一个整型异常,12.

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

9、后的catch语句捕获。,另一个异常处理的简单例子,int division(int x, int y); int main( ) int m,n; coutmn; try coutdivision(m,n)endl; catch(int) cout“Divided by 0!“endl; return -1; return 0; int division(int x,int y) if (y=0) throw 0; return x/y; 返回,catch语句捕获一个整型异常并处理,在try代码块中包含需要监控的程序部分,抛出一个整型异常,catch,当在try中的代码抛出一个异常时,它将被

10、相应的catch语句捕获并处理。 在try语句后面可以有一个或多个catch语句。 如果在catch语句中指定的数据类型与异常的类型匹配,那么这个catch语句将被执行。 所有其他的catch语句都将被忽略。,catch (续),当异常信息被捕获时,变量arg将用来接收异常信息的值。例如: 如果抛出的异常没有与之类型相匹配的catch语句,那么将发生非正常的程序终止(abnormal program termination )。例如 如果程序中抛出了一个未被处理的异常,系统将调用C+标准库中的函数terminate( )。 在默认情况下,函数terminate( )将调用abort( )函数来

11、终止程序,但如果需要,也可以定制自己定义的函数来终止程序的执行。,变量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; return 0; 返回,变量arg用来接收throw抛出的异常值,抛出的异常的值与变量arg类型不配,#include using namespace std; int main( ) int m,

12、n; coutmn; try if (n=0) throw 0; cout (m/n)endl; catch(char * arg) coutargendl; return -1; return 0; 返回,抛出的异常的值与变量arg类型不配,12.3.2 捕获函数内部抛出的异常,#include using namespace std; int division(int x, int y); int main( ) int m,n; coutmn; try coutdivision(m,n)endl; catch(int) cout“Divided by 0!“endl; return -1

13、; return 0; ,从函数内部抛出异常,int division(int x,int y) if (y=0) throw 0; /异常信息从函数内部抛出 return x/y; ,12.3.3 多个catch语句,void Xhandler(int test) try 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语句所能捕

14、获的异常必须是不同类型,使用多个catch语句(续),int main( ) cout “startn“; Xhandler(1); Xhandler(2); Xhandler(0); Xhandler(3); cout “end“; return 0; ,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; retu

15、rn -1; return 0; ,abnormal program termination,执行上面的程序时,如果输入的除数为零,就会发生程序非正常终止。 执行情况如下: Please input two integers: 2 0 abnormal program termination,非正常的程序终止,如果抛出的异常没有与之类型相匹配的catch语句,则该异常信息将被传递到调用该程序模块的上一级,它的上级捕获到这个异常信息后进行处理。 如果上一级模块仍然不能处理,就再传递给其上一级,如此逐级上传,如果到最高一级还无法处理。那么将发生非正常的程序终止(abnormal program t

16、ermination )。,12.3.5 自定义运行终止函数,如果在程序中抛出了一个未被处理的异常信息,系统将调用C+标准库中的函数terminate( )。在默认情况下,函数terminate( )将调用abort( )函数来终止程序。 程序员也可以编写自己的终止函数,然后通过set_terminate函数传递给异常处理模块,使系统在找不到相匹配的异常错误处理模块时调用该函数。,示例:自定义的运行终止函数,#include using namespace std; void myterm() /自定义的运行终止函数 cout“This is my terminater.“endl; /.释放程序中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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