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

下载本文档

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

文档简介

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 m

3、ain(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 ways yo

4、u 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; source.cl

5、ose(); return 0; 异常处理代码12.2 C语言处理异常的方法 从函数返回出错信息,如果函数的返回值不便于返回出错信息,就设置一个全局的出错标志。(标准C提供errno和perror( )来支持这种方法) 这种方法的缺陷:繁琐 处理异常的代码和正常算法的代码交织在一起,增加了代码的复杂性,降低了可读性。 程序员很容易忽视函数的返回值。printf( ) 设置全局的出错标志降低了各个模块的独立性。 使用C 语言标准库中的信号处理系统中的signal( ) 函数和 raise( )函数。 这种方法的缺陷:复杂 程序员需要理解信号产生的机制并安装合适的信号处理机制。 对于大型项目,不同

6、库之间的信号可能会产生冲突。 使用C标准库中非局部的跳转函数: setjmp( ) 和longjmp( )。 这种方法的缺陷: 增加了模块之间的耦合性 上述第二和第三种方法的共同缺陷:不能调用析构函数进行善后处理,不能释放对象占用的资源。实际上不可能有效正确地从异常情况中恢复出来。12.3 C+语言的异常处理方法 C+的异常处理机制的基本思想是将异常的检测与处理分离。 C+中异常错误处理用try、throw和catch三个关键字实现一个异常处理的简单例子#include using namespace std;int main( ) int m,n;coutmn;tryif (n=0) thr

7、ow 0;cout (m/n)endl;catch(int)coutDivided by 0!endl;return -1; return 0;catch语句捕获一个整型异常并处理在try代码块中包含需要监控的程序部分抛出一个整型异常try/ try Blockcatch (type1 arg)/exception handling for type1catch (type2 arg)/exception handling for type2/.catch (typeN arg)/exception handling for typeNtry 和 throw要监控的程序部分必须包含在try代码

8、块中,(在try块中调用的函数也将被监控,参见)。如果try块中的程序代码发生了异常错误,那么这个异常将被抛出(使用throw)。try块中抛出的异常将被紧跟在try语句之后的catch语句捕获。另一个异常处理的简单例子int division(int x, int y);int main( ) int m,n;coutmn;trycoutdivision(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;返回catc

9、h语句捕获一个整型异常并处理在try代码块中包含需要监控的程序部分抛出一个整型异常catch 当在try中的代码抛出一个异常时,它将被相应的catch语句捕获并处理。 在try语句后面可以有一个或多个catch语句。 如果在如果在catch语句中指定的数据类型与异语句中指定的数据类型与异常的类型匹配,那么这个常的类型匹配,那么这个catch语句将被语句将被执行。执行。 所有其他的catch语句都将被忽略。catch (续) 当异常信息被捕获时,变量arg将用来接收异常信息的值。例如: 如果抛出的异常没有与之类型相匹配的catch语句,那么将发生非正常的程序终止(abnormal program

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

11、arg用来接收throw抛出的异常值抛出的异常的值与变量arg类型不配#include using namespace std;int main( ) int m,n;coutmn;tryif (n=0) throw 0;cout (m/n)endl;catch(char * arg)coutargendl;return -1; return 0;返回抛出的异常的值与变量arg类型不配#include using namespace std;int division(int x, int y);int main( ) int m,n;coutmn;trycoutdivision(m,n)end

12、l;catch(int)coutDivided by 0!endl;return -1; return 0;从函数内部抛出异常int division(int x,int y) if (y=0)throw 0;/异常信息从函数内部抛出return x/y;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; 每个

13、catch语句所能捕获的异常必须是不同类型使用多个catch语句(续)int main( ) cout startn; Xhandler(1); Xhandler(2); Xhandler(0); Xhandler(3); cout end; return 0;#include using namespace std;int main( ) int m,n;coutmn;tryif (n=0) throw 0;cout (m/n)endl;catch(char * arg)/ 抛出的异常信息的值与形参变量arg类型不配coutargendl;return -1; return 0;abnorm

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

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

16、rm);/.throw Exception . ;catch(int i) return 0;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; 捕获所有其他的异常void Xhandler(int test) try if(test=0) throw test;

17、 / 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; 12.4 异常类和C+标准异常 catch可以捕获任意类型的异常,包括程序员自己创建的类型。 在实际程序中,大多数异常的类型都是类,而不是内置数据类型(标准类型)。 为异常定义一个类的最

18、好理由是:我们可以创建一个类来描述发生的错误信息,而这个信息可以帮助异常处理模块处理错误。例如: 实际应用中使用的大多数异常类远比MyException要复杂。#include #include using namespace std;class MyException public: char str_what80; MyException() *str_what = 0; MyException(char *s) strcpy(str_what, s); ;使用异常类使用异常类(续)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;返回表12.1 C+语言本身抛出的标准异常标准异常的名字抛出异常的主体对应的头文件bad_a

温馨提示

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

评论

0/150

提交评论