版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+面向对象程序设计教学内容,第1章C+概述第2章类和对象第3章面向对象程序设计概述第4章进一步学习类和对象第5章堆与复制构造函数第6章继承性:派生类第7章运算符重载第8章虚函数和多态性第9章模板第10章类库和C+的标准模板库STL第11章输入输出流第12章异常处理,第12章异常处理,12.1异常处理的概念12.2C语言处理异常的方法12.3C+语言的异常处理方法12.4异常类和C+标准异常,12.1异常处理的概念,异常(Exception)是程序可能检测到的运行时刻不正常的情况。最常见的异常包括除数为0,数组越界访问,磁盘或者光盘读写失败,无效数据,内存耗尽,网络不通等。异常总是代表着某些不
2、该发生的事情发生了,异常错误,在程序运行阶段由于系统异常原因而产生的错误称为异常错误异常错误与程序设计错误是两码事,异常错误与程序设计错误,程序设计错误是指程序员在设计程序时由于人为因素所产生的错误。异常错误是在程序运行时由于系统异常原因而产生的,不是程序员的失误所致。,如果不排除程序设计错误,程序就不能通过编译检查或运行结果不对。如果不处理异常错误,程序执行时遇到异常情况就会突然终止或失控,使用户感到莫名其妙。,一个异常错误的例子,#include#includeusingnamespacestd;intmain(intargc,char*argv)ifstreamsource(argv1)
3、;/打开文件charline128;while(!source.eof()source.getline(line,sizeof(line);coutlineendl;source.close();return0;,异常处理,异常处理即异常错误处理异常处理的任务就是使程序的运行过程能从异常错误中恢复过来继续执行或者通知用户遇到了何种异常,不得不停止执行。Improvederrorrecoveryisoneofthemostpowerfulwaysyoucanincreasetherobustnessofyourcode.robustness鍵壯性,穩固性,穩健性,堅固性,异常处理的例子,intm
4、ain(intargc,char*argv)ifstreamsource(argv1);/打开文件charline128;if(source.fail()couterroropeningthefileargv1endl;exit(1);while(!source.eof()source.getline(line,sizeof(line);coutlineendl;source.close();return0;,异常处理代码,12.2C语言处理异常的方法,12.2.1检查函数的返回值来发现异常错误12.2.2使用signal()和raise()函数12.2.3使用非局部的跳转Goto函数,12.
5、2.1检查函数的返回值来发现异常错误,从函数返回出错信息,如果函数的返回值不便于返回出错信息,就设置一个全局的出错标志。(标准C提供errno和perror()来支持这种方法)这种方法的缺陷:繁琐处理异常的代码和正常算法的代码交织在一起,增加了代码的复杂性,降低了可读性。程序员很容易忽视函数的返回值。printf()设置全局的出错标志降低了各个模块的独立性。,12.2.2使用signal()和raise()函数,使用C语言标准库中的信号处理系统中的signal()函数和raise()函数。这种方法的缺陷:复杂程序员需要理解信号产生的机制并安装合适的信号处理机制。对于大型项目,不同库之间的信号可
6、能会产生冲突。,12.2.3使用非局部的跳转Goto函数,使用C标准库中非局部的跳转函数:setjmp()和longjmp()。这种方法的缺陷:增加了模块之间的耦合性上述第二和第三种方法的共同缺陷:不能调用析构函数进行善后处理,不能释放对象占用的资源。实际上不可能有效正确地从异常情况中恢复出来。,12.3C+语言的异常处理方法,C+的异常处理机制的基本思想是将异常的检测与处理分离。C+中异常错误处理用try、throw和catch三个关键字实现,一个异常处理的简单例子,#includeusingnamespacestd;intmain()intm,n;coutmn;tryif(n=0)thro
7、w0;cout(m/n)endl;catch(int)coutDividedby0!endl;return-1;return0;,catch语句捕获一个整型异常并处理,在try代码块中包含需要监控的程序部分,抛出一个整型异常,12.3.1C+程序处理异常的一般形式,try/tryBlockcatch(type1arg)/exceptionhandlingfortype1catch(type2arg)/exceptionhandlingfortype2/.catch(typeNarg)/exceptionhandlingfortypeN,try和throw,要监控的程序部分必须包含在try代码块
8、中,(在try块中调用的函数也将被监控,参见)。如果try块中的程序代码发生了异常错误,那么这个异常将被抛出(使用throw)。try块中抛出的异常将被紧跟在try语句之后的catch语句捕获。,另一个异常处理的简单例子,intdivision(intx,inty);intmain()intm,n;coutmn;trycoutdivision(m,n)endl;catch(int)coutDividedby0!endl;return-1;return0;intdivision(intx,inty)if(y=0)throw0;returnx/y;返回,catch语句捕获一个整型异常并处理,在tr
9、y代码块中包含需要监控的程序部分,抛出一个整型异常,catch,当在try中的代码抛出一个异常时,它将被相应的catch语句捕获并处理。在try语句后面可以有一个或多个catch语句。如果在catch语句中指定的数据类型与异常的类型匹配,那么这个catch语句将被执行。所有其他的catch语句都将被忽略。,catch(续),当异常信息被捕获时,变量arg将用来接收异常信息的值。例如:如果抛出的异常没有与之类型相匹配的catch语句,那么将发生非正常的程序终止(abnormalprogramtermination)。例如如果程序中抛出了一个未被处理的异常,系统将调用C+标准库中的函数termin
10、ate()。在默认情况下,函数terminate()将调用abort()函数来终止程序,但如果需要,也可以定制自己定义的函数来终止程序的执行。,变量arg用来接收异常的值,#includeusingnamespacestd;intmain()intm,n;coutmn;tryif(n=0)throwDividedby0!;cout(m/n)endl;catch(char*arg)coutargendl;return-1;return0;返回,变量arg用来接收throw抛出的异常值,抛出的异常的值与变量arg类型不配,#includeusingnamespacestd;intmain()int
11、m,n;coutmn;tryif(n=0)throw0;cout(m/n)endl;catch(char*arg)coutargendl;return-1;return0;返回,抛出的异常的值与变量arg类型不配,12.3.2捕获函数内部抛出的异常,#includeusingnamespacestd;intdivision(intx,inty);intmain()intm,n;coutmn;trycoutdivision(m,n)endl;catch(int)coutDividedby0!endl;return-1;return0;,从函数内部抛出异常,intdivision(intx,int
12、y)if(y=0)throw0;/异常信息从函数内部抛出returnx/y;,12.3.3多个catch语句,voidXhandler(inttest)tryif(test)throwtest;elsethrowValueiszero;catch(inti)coutCaughtOne!Ex.#:in;catch(char*str)coutCaughtastring:;coutstrn;,每个catch语句所能捕获的异常必须是不同类型,使用多个catch语句(续),intmain()coutstartn;Xhandler(1);Xhandler(2);Xhandler(0);Xhandler(3
13、);coutend;return0;,12.3.4非正常的程序终止,#includeusingnamespacestd;intmain()intm,n;coutmn;tryif(n=0)throw0;cout(m/n)endl;catch(char*arg)/抛出的异常信息的值与形参变量arg类型不配coutargendl;return-1;return0;,abnormalprogramtermination,执行上面的程序时,如果输入的除数为零,就会发生程序非正常终止。执行情况如下:Pleaseinputtwointegers:20abnormalprogramtermination,非正
14、常的程序终止,如果抛出的异常没有与之类型相匹配的catch语句,则该异常信息将被传递到调用该程序模块的上一级,它的上级捕获到这个异常信息后进行处理。如果上一级模块仍然不能处理,就再传递给其上一级,如此逐级上传,如果到最高一级还无法处理。那么将发生非正常的程序终止(abnormalprogramtermination)。,12.3.5自定义运行终止函数,如果在程序中抛出了一个未被处理的异常信息,系统将调用C+标准库中的函数terminate()。在默认情况下,函数terminate()将调用abort()函数来终止程序。程序员也可以编写自己的终止函数,然后通过set_terminate函数传递给
15、异常处理模块,使系统在找不到相匹配的异常错误处理模块时调用该函数。,示例:自定义的运行终止函数,#includeusingnamespacestd;voidmyterm()/自定义的运行终止函数coutThisismyterminater.endl;/.释放程序中申请的系统资源exit(1);intmain()/.tryset_terminate(myterm);/.throwException.;catch(inti)return0;,12.3.6捕获所有的异常,voidXhandler(inttest)tryif(test=0)throwtest;/throwintif(test=1)th
16、rowa;/throwcharif(test=2)throw123.23;/throwdoublecatch(.)/catchallexceptions捕获所有的异常coutCaughtOne!n;,捕获所有其他的异常,voidXhandler(inttest)tryif(test=0)throwtest;/throwintif(test=1)throwa;/throwcharif(test=2)throw123.23;/throwdoublecatch(inti)/catchanintexceptioncoutCaughtin;catch(.)/catchallotherexceptions
17、捕获所有其他的异常coutCaughtOne!n;,12.4异常类和C+标准异常,catch可以捕获任意类型的异常,包括程序员自己创建的类型。在实际程序中,大多数异常的类型都是类,而不是内置数据类型(标准类型)。为异常定义一个类的最好理由是:我们可以创建一个类来描述发生的错误信息,而这个信息可以帮助异常处理模块处理错误。例如:实际应用中使用的大多数异常类远比MyException要复杂。,12.4.1使用异常类,#include#includeusingnamespacestd;classMyExceptionpublic:charstr_what80;MyException()*str_wh
18、at=0;MyException(char*s)strcpy(str_what,s);,使用异常类,使用异常类(续),intmain()inta,b;trycoutab;if(!b)throwMyException(Cannotdividebyzero!);elsecoutQuotientisa/bn;catch(MyExceptione)/catchanerrorcoute.str_whatn;return0;返回,12.4.2C+语言中的标准异常,表12.1C+语言本身抛出的标准异常,【例12.11】处理异常类bad_alloc对象,#include#include/需要包含该头文件usingnamespacestd;.tryp=newint32;/为整型数组申请动态存储单元catch(bad_allocxa)coutAllocationfailure.分配内存失败。n;return1;.,12.4.3C+异常处理机制的好处,将程序中正常处理的代码(描述问题的算法)与异常处理代码分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版桶装水电商销售与物流配送合作协议3篇
- AAA 玻璃有限公司烟气余热发电项目可行性研究报告
- 酒店行业助理的工作概述
- 幼儿园工作总结爱心传递温馨舒适
- 二零二五年度:我国行政合同中优益权在公共服务领域的应用论文3篇
- 2025版物业纠纷调解与法律服务合作协议2篇
- 二零二五年度个人版权保护与维权服务合同2篇
- 2025版食材配送与餐饮加盟合作合同模板3篇
- 二零二五年度能源合同能源管理服务协议范本2篇
- 聚氨酯发泡保温施工方案
- 2017年江苏南京中考满分作文《无情岁月有味诗》5
- 2024-2030年中国智慧水务行业应用需求分析发展规划研究报告
- 2024年中国南水北调集团新能源投资限公司抽水蓄能项目岗位公开招聘高频考题难、易错点模拟试题(共500题)附带答案详解
- 中国2型糖尿病运动治疗指南 (2024版)
- 基础构成设计全套教学课件
- 城市道路交通安全评价标准 DG-TJ08-2407-2022
- 统编版高中政治选择性必修2《法律与生活》知识点复习提纲详细版
- 急腹症的诊断思路
- 2024小说推文行业白皮书
- 研究性成果及创新性成果怎么写(通用6篇)
- 特殊感染手术管理考试试题及答案
评论
0/150
提交评论