C面向对象程序设计第12章异常处理.ppt

上传人:小飞机 文档编号:5426584 上传时间:2023-07-05 格式:PPT 页数:42 大小:262.50KB
返回 下载 相关 举报
C面向对象程序设计第12章异常处理.ppt_第1页
第1页 / 共42页
C面向对象程序设计第12章异常处理.ppt_第2页
第2页 / 共42页
C面向对象程序设计第12章异常处理.ppt_第3页
第3页 / 共42页
C面向对象程序设计第12章异常处理.ppt_第4页
第4页 / 共42页
C面向对象程序设计第12章异常处理.ppt_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《C面向对象程序设计第12章异常处理.ppt》由会员分享,可在线阅读,更多相关《C面向对象程序设计第12章异常处理.ppt(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 main(int argc,char*argv)if

3、stream 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 you can increase the robustness of your c

4、ode.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.close();return 0;,异常处理代码,12.2 C语言处理异常的方法,12.2.1 检查函数的返

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

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

7、的简单例子,#include using namespace std;int main()int m,n;coutmn;tryif(n=0)throw 0;cout(m/n)endl;catch(int)coutDivided by 0!endl;return-1;return 0;,catch语句捕获一个整型异常并处理,在try代码块中包含需要监控的程序部分,抛出一个整型异常,12.3.1 C+程序处理异常的一般形式,try/try Blockcatch(type1 arg)/exception handling for type1catch(type2 arg)/exception han

8、dling for type2/.catch(typeN arg)/exception handling for typeN,try 和 throw,要监控的程序部分必须包含在try代码块中,(在try块中调用的函数也将被监控,参见)。如果try块中的程序代码发生了异常错误,那么这个异常将被抛出(使用throw)。try块中抛出的异常将被紧跟在try语句之后的catch语句捕获。,另一个异常处理的简单例子,int division(int x,int y);int main()int m,n;coutmn;trycoutdivision(m,n)endl;catch(int)coutDivid

9、ed 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中的代码抛出一个异常时,它将被相应的catch语句捕获并处理。在try语句后面可以有一个或多个catch语句。如果在catch语句中指定的数据类型与异常的类型匹配,那么这个catch语句将被执行。所有其他的catch语句都将被忽略。,catch(续),当异常信息被捕获时,变量arg将用来接收异常信息的值。例如:

10、如果抛出的异常没有与之类型相匹配的catch语句,那么将发生非正常的程序终止(abnormal program 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(c

11、har*arg)coutargendl;return-1;return 0;返回,变量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类型不配,12.3.2 捕获函数内部抛出的异常,#include using namespace std;int division(int x,i

12、nt 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;,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.

13、#:i n;catch(char*str)cout Caught a string:;cout str n;,每个catch语句所能捕获的异常必须是不同类型,使用多个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;tryif(n=0)throw 0;cout(m/n)endl;catch(char*arg)

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

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

16、erminater.endl;/.释放程序中申请的系统资源exit(1);int main()/.tryset_terminate(myterm);/.throw Exception.;catch(int i)return 0;,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 Ca

17、ught One!n;,捕获所有其他的异常,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;,12.4 异常类和C+标准异常,catch可以捕获任意类型的异常,包括程

18、序员自己创建的类型。在实际程序中,大多数异常的类型都是类,而不是内置数据类型(标准类型)。为异常定义一个类的最好理由是:我们可以创建一个类来描述发生的错误信息,而这个信息可以帮助异常处理模块处理错误。例如:实际应用中使用的大多数异常类远比MyException要复杂。,12.4.1 使用异常类,#include#include using namespace std;class MyException public:char str_what80;MyException()*str_what=0;MyException(char*s)strcpy(str_what,s);,使用异常类,使用异常

19、类(续),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.4.2 C+语言中的标准异常,表12.1 C+语言本身抛出的标准异常,【例12.11】处理异常类bad_alloc对象,#include#include/需要包含该头文件using namespace std;.try p=new int

20、32;/为整型数组申请动态存储单元 catch(bad_alloc xa)cout Allocation failure.分配内存失败。n;return 1;.,12.4.3 C+异常处理机制的好处,将程序中正常处理的代码(描述问题的算法)与异常处理代码分离开来,提高了程序的可读性。提供了一种更规则的处理异常的风格,便于软件项目组人员之间的合作。通常情况下,类的创建者监控代码段,从类中抛出异常。类的使用者捕获到异常并处理。,C+异常处理机制的好处(续),在异常发生时,能够撤销对象,并自动调用析构函数进行善后处理,释放对象所占用的系统资源。,发生异常时资源释放,class Y int*p;void init();public:Y(int s)p=new ints;init();Y()delete p;/.;,A safe variant,class Z vector p;void init();public:Z(int s):p(s)init();/.;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号