版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 异常处理 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法异常处理概述异常处理概述n异常处理是C+程序设计的一个重要功能。n应用异常处理有助于程序员编写出更清晰更健壮更具容错性的程序。n异常处理使程序可以捕捉和处理程序在运行时出现的异常。nC+程序使用try、throw和catch语句来支持异常处理。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2
2、异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.1 异常的概念异常的概念n异常是一种程序定义的错误,它对程序的逻辑错误进行设防,对运行异常加以控制。C+中,异常是对所能预料的运行错误进行处理的一套实现机制。n程序的错误有两种,一种是语法错误。如果使用了错误的语法、函数、结构和类,程序就无法被生成运行代码。另一种是在运行时发生的错误,它分为不可预料的逻辑错误和可以预料的运行异常。n可以预料的运行异常,是由系统运行环境造成的,它不能避免。然而这些错
3、误是能够预料的,通常加入一些预防代码便可防止这些异常。如,对文件打不开时的保护: 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.1 异常的概念异常的概念#include /void f(char * str) ifstream source(str,ios:nocreate); /打开str串中的文件,当文件不存在时不创建 if (source.fail() /判断文件是否
4、可打开 cerr “Error opening the file:” str endl; exit(1); /退出程序 / 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法如,对文件打不开时的保护:10.2 异常的基本思想异常的基本思想n在小型程序中,一旦发生异常,一般是将程序立即中断运行,从而无条件释放所有资源。n对于大型程序来说,运行中一旦发生异常,应该允许恢复和继续运行。n典
5、型地,当发生异常与处理异常不在同一个函数中的异常的发生、传递与处理的情形如图10-1所示。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.2 异常的基本思想异常的基本思想 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异
6、常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.2 异常的基本思想异常的基本思想异常的基本思想:(1) 实际的资源分配(如内存申请或文件打开)通常在程序的低层进行,如图10-1中的k( )。(2) 当操作失败、无法分配内存或无法打开一个文件时,在逻辑上如何进行处理通常是在程序的高层,如图10-1中的f( ),中间还可能有与用户的对话。(3)异常为从分配资源的代码转向处理错误状态的代码提供了一种表达方式。如果还存在中间层次的函数,如图10-1中的g( ),则为它们释放所分配的内存提供了机会,但这并不包括用于传递错误状态信息的代码。 第第10章章 异常处理异常处理10.1 异常的
7、概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.2 异常的基本思想异常的基本思想nC+异常处理的目的,是在异常发生时,尽可能地减小破坏,周密地善后,而不去影响其它部分程序的运行。这在大型程序中是非常必要的。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异
8、常处理机制10.7 使用异常的方法使用异常的方法10.3 异常的实现异常的实现n异常是通过try语句块、throw语句和catch语句块来实现的。n将那些有可能产生错误的语句框定在try块中;nthrow语句,检测是否产生异常,若是,则抛掷异常。ncatch语句块,定义异常处理,将异常处理的语句放在catch块中,以便异常被传递过来时就处理它; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使
9、用异常的方法10.3 异常的实现异常的实现例如,下面的程序,设置了防备文件打不开的异常:#include #include #include void main(int argc, char * argv) ifstream source(argv1); /打开文件 char line128; try if(source.fail() throw argv1; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7
10、使用异常的方法使用异常的方法10.3 异常的实现异常的实现catch(char* s) cout error opening the file s endl; exit(1); while(!source.eof() source.getline(line, sizeof(line); cout line ch10_1 f1.txterror opening the file f1.txtC:ch10_1 f2.txtHello! 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规
11、则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.3 异常的实现异常的实现n这里抛掷异常(throw argv1)与处理异常(catch块)在同一个函数中。当打开文件失败时,就执行“throw argv1;”语句,throw后面的表达式argv1的类型被称为所引发的异常的类型。ntry块结构表示块中的语句可能会发生异常,放在其中加以监控。在try块结构中,用throw语句抛出发生的异常。C+只理会受监控的过程的异常。n在try块之后必须紧跟一个或多个catch( )语句,其后的catch( )语句与try语句之间不能有其它语句隔开。cat
12、ch( )括号中的声明只能容纳一个形参,当类型与抛掷异常的类型匹配时,该catch( )块便称捕获了一个异常而转到其块中进行异常处理。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.3 异常的实现异常的实现n在上例中,如果不使用异常处理,我们也可以使用下面的程序段来处理打开文件时可能出现的错误。if (source.fail( )cout”error opening the
13、 file”argv1endl;exit(1); 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.3 异常的实现异常的实现n在简单程序设计中,用这种直接加入异常处理代码的方式是可以的,但是在大型复杂程序的设计中,特别是当处理异常与抛掷异常的代码不在同一函数中时,用这种直接加入异常处理代码的方法很难实现,而且使程序结构不够清晰。n需要注意的是,抛出异常后由哪个异常处理块处理,是
14、由参数类型的匹配来决定的,而且这种类型的匹配是严格的匹配,不支持类型的自动转换。n抛出异常的参数类型是人为选定的,可以是一个特定类型的变量,也可以是程序定义的特定类型的对象。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.3 异常的实现异常的实现n抛掷异常与处理异常可以放在不同的函数中。例如,下面的程序定义一个除零异常:#include int Div(int, int )
15、;void p(int,int);void main()try p(8,2); p(8,0); p(8,4); 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法catch(int) cout except of dividing zero.n;cout That is ok. n;void p(int i, int j)cout i/j= Div(i, j) endl; 第第10章
16、章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法int Div(int a, int b) if(b=0) throw b; return a/b;运行结果为:8/2=4except of dividing zero.That is ok. 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则
17、异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.4 异常处理的规则异常处理的规则n以catch开始的程序块是异常处理程序,编写异常处理程序的规则是:n一个或多个catch分程序必须紧接在try分程序之后。在try分程序出现之前,不能出现这些catch程序块。n在catch( )行的圆括号中可包含数据类型声明,它与函数定义中参数声明起的作用相同。异常处理catch块可看作是函数分程序。跟在catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。在数据类型之后放参数名是可选的。参数名使得被捕获的对象在处理程序分程
18、序中被引用。n如果一个函数抛掷一个异常,但在通往异常处理函数的调用链中找不到与之匹配的catch,则该程序通常以abort( )函数调用终止。n如果catch分程序执行完毕,则继续执行跟随在最后catch分程序的代码。 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.5 多路捕获多路捕获nC+异常处理机制支持异常的多路捕获,即程序可能有若干不同种类的运行错误,可以用多路捕获机
19、制处理这些异常。每种异常可与一个类、一个数据类型或一个值有关。n例如,操作String类对象时,预设两个异常: 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法#include #include class Stringpublic:String(char*, int);class ExceptofRange /异常类1 public: ExceptofRange(int j):i
20、ndex(j) int index; class ExceptofSize; /异常类2 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法char& operator(int k) if(0=k & klen) return sk; throw ExceptofRange(k); private: char* s; int len; static int max;i
21、nt String:max = 20; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法String:String(char* str, int si) if(si0 | maxsi) throw ExceptofSize(); s=new charsi; strncpy(s, str, si); len=si; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2
22、 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法void g(String& str) int num=10; for(int n=0; nnum; n+) cout strn; /运算符重载 cout endl;void f() /代码区1 try /代码区2 String s(abcdefghijklmnop, 10); g(s); 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.
23、3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法catch(String:ExceptofRange r) cerr out of range: r.index endl; /代码区3 catch(String:ExceptofSize) cerr size illegal!n; cout The program will be continued here.nn; /代码区4 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3
24、 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法void main() /代码区5 f(); cout These code is not effected by probably exception in f().n; 运行结果为:abcdefghijThe program will be continued here 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则
25、10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.6 异常处理机制异常处理机制n通常人们希望抛掷被及时捕获,以避免程序突然终止。异常如果被程序定义的异常处理程序捕获后,可以进入相应的异常处理过程。这样,即使发生了异常,但程序的后继部分还可以继续受用户程序控制,继续运行。例如,抛掷和捕获可以用来重新开始程序内的一个过程,或者从应用程序的一部分跳到另一部分,或者回到菜单。n例如,下面的代码说明了异常处理机制: 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4
26、 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法void f()tryg()catch(ExceptofRange)/catch(ExceptofSize)/ 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法catch()/void g()h();void h()tryh1(); 第第10章章 异常处理
27、异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法catch(ExceptofSize)/throw 10;catch(ExceptofMatherr)/ 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使
28、用异常的方法void h1()/throw(ExceptofSize);try/throw ExceptofRange;h2();h3();catch(ExceptofSize)/throw; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法void h2()/throw ExceptofMatherr;void h3()/throw ExceptofSize; 第第10章章 异常
29、处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法10.7 使用异常的方法使用异常的方法n可以把多个异常组成族系。在C+代码中把异常组在一起有两种方式:异常枚举族系和异常派生层次结构。例如可以用这两种方法将数学错误和文件处理错误组成相应的异常族系。n例如,通过异常枚举族系的方法将几个文件处理错误组成一个异常族系,可以定义的异常包括文件不存在异常noExist、格式错误异常wrongFormat、读写错
30、误异常accessError三种错误,每种异常对应于一个枚举常量值。当然,可以根据需要定义其它可能出现的异常。如: 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法enum FileErrors(nonExist,wrongFormat,accessError);int f()try/throw wrongFormat; 第第10章章 异常处理异常处理10.1 异常的概念异常的概念10.2 异常的基本思想异常的基本思想10.3 异常的实现异常的实现10.4 异常处理的规则异常处理的规则10.5 多路捕获多路捕获10.6 异常处理机制异常处理机制10.7 使用异常的方法使用异常的方法catch(FileErrors fe)switch(fe)case nonExist:/case wrongFormat:/case accessErro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度济南水务集团有限公司员工招聘160人笔试参考题库附带答案详解
- 2025年度安徽宣城市城建物业服务有限公司第一次招聘16人笔试参考题库附带答案详解
- 2025年度北京水保生态工程咨询有限公司公开招聘5人笔试参考题库附带答案详解
- 2025年度中国林业集团有限公司春季公开招聘高校应届毕业生159人+笔试参考题库附带答案详解
- 2025年度七冶安装工程有限责任公司第三批技术工人公开招聘88人笔试参考题库附带答案详解
- 2025年安徽港航物流有限公司及所属企业第一批次公开招聘14人笔试参考题库附带答案详解
- 2025年天津水务集团有限公司对外招聘(74人)笔试参考题库附带答案详解
- 2025年国能北电胜利能源有限公司高校毕业生春季招聘笔试参考题库附带答案详解
- 2025年国网四川省电力公司高校毕业生招聘800人(第一批)笔试参考题库附带答案详解
- 未来五年挂历市场需求变化趋势与商业创新机遇分析研究报告
- 近十年陕西中考数学真题及答案(2022年)
- 医学临床“三基”训练护士分册(第五版)考试题(附答案)
- 水利工程施工监理规范(SL288-2014)用表填表说明及示例
- 江苏省常州市2024年中考化学真题【附真题答案】
- DL-T5159-2012电力工程物探技术规程
- 安全防护装备使用培训
- 吸痰器使用培训课件
- 800兆数字集群政务网介绍
- 泵房调试要有方案
- 大众蔚揽保养手册
- 成都市2022届高中毕业班第一次诊断性检测英语
评论
0/150
提交评论