异常.ppt
《异常.ppt》由会员分享,可在线阅读,更多相关《异常.ppt(39页珍藏版)》请在三一文库上搜索。
1、第8章 异常,8.1 异常处理概述,商业软件常会提供许多错误处理代码,以便对各种可能出现错误的程序代码进行检测和处理,增加程序的健壮性。 处理程序错误的代码可能出现在源码的任何地方,比如判定new是否成功分配内存、数据下标是否越界、运算溢出、除数0、无效参数等。 错误处理代码“污染”了程序源码、大量的错误处理代码使原本简单的程序变得晦涩难懂。,8.1 异常处理概述,2、传统的异常处理方法 传统程序处理异常的典型方法是不断测试程序继续运行的必要条件,并对测试结果进行处理。 形式如下伪码所示: 执行任务1 if 任务1未能被正确执行 执行错误处理程序 执行任务2 if 任务2未能正确执行 执行错误
2、处理程序 执行任务3 缺点 错误处理代码分布在整个程序的各个部分,使程序受到了错误处理代码的“污染”。,8.1 异常处理概述,3、C+异常处理思想 其基本思想是将异常发生和异常处理分别放在不同的函数中,产生异常的函数不需要具备处理异常的能力。 当一个函数出现异常时,它可以抛出一个异常,然后由该函数的调用者捕获并处理这个异常,如果调用者不能处理,它可以将该异常抛给其上一级的调用者处理。,8.1 异常处理概述,4、C+的异常处理的作用 改善程序的可读性和可维护性,将异常处理代码与主要程序代码分离,适合团队开发大型项目。 有力的异常检测和可能的异常恢复,以统一方式处理异常。 在异常引起系统错误之前处
3、理异常。 处理由库函数引起的异常。 在出现无法处理的异常时执行清理工作,并以适当的方式退出程序。 在动态调用链中有序地传播异常处理。,8.2 C+异常处理基础,8.2.1 异常处理的结构 try /try程序块 if err1 throw xx1 if err2 throw xx2 if errn throw xxn catch(type1 arg) /异常类型1错误处理 catch(type2 arg) /异常类型2错误处理 catch(typem arg) /异常类型m错误处理 ,8.2 C+异常处理基础,try-throw-catch异常处理的执行逻辑如下 1、当程序执行过程中遇到try
4、块时,将进入try块并按正常的程序逻辑顺序执行其中的语句 2、如果try块的所有语句都被正常执行,没有发生任何异常,那么try块中就不会有异常被throw。在这种情况下,程序将忽略所有的catch块,顺序执行那些不属于任何catch块的程序语句,并按正常逻辑结束程序的执行,就像catch块不存在一样。,8.2 C+异常处理基础,3、如果在执行try块的过程中,某条语句产生错误并抛出了throw异常,则程序控制流程将自此throw子句转移到catch块,try块中该throw语句之后的所有语句都不会再被执行了。 4、C+将按catch块出现的次序,用异常的数据类型与每个catch参数表中指定的数
5、据类型相比较,如果两者类型相同,就执行该catch块,同时还将把异常的值传递给catch块中的形参arg(如果该块有arg形参)。只要有一个catch块捕获了异常,其余catch块都将被忽略。 5、如果没有任何catch能够匹配该异常,C+将调用系统默认的异常处理程序处理该异常,其通常做法是直接终止该程序的运行。,【例8-1】 异常处理的简单例程。 /Eg8-1.cpp #include using namespace std; void main() cout“1-befroe try block.“endl; try cout“2-Inside try block.“endl; throw
6、 10; cout“3-After throw “endl; catch(int i) cout“4-In catch block1 . exceptionerrcode is“iendl; catch(char * s) cout“5-In catch block2 . exceptionerrcode is“sendl; cout“6-After Catch.“; ,1-befroe try block. 2-Inside try block. 4-In catch block1 . exceptionerrcode is10 6-After Catch,8.2.2 异常捕获,异常捕获由c
7、atch完成,catch必须紧跟在与之对应的try块后面。 如果异常被某catch捕获,程序将执行该catch块中的代码,之后将继续执行catch块后面的语句; 如果异常不能被任何catch块捕获,它将被传递给系统的异常处理模块,程序将被系统异常处理模块终止。 catch根据异常的数据类型捕获异常,如果catch参数表中异常声明的数据类型与throw抛出的异常的数据类型相同,该catch块将捕获异常。 注意:catch在进行异常数据类型的匹配时,不会进行数据类型的默认转换,只有与异常的数据类型精确匹配的catch块才会被执行。,8.2.2 异常捕获,【例8-2】 catch捕获异常时,不会进行
8、数据类型的默认转换。 /Eg8-2.cpp #include using namespace std; void main() cout“1-befroe try block.“endl; try cout“2-Inside try block.“endl; throw 10; cout“3-After throw “endl; catch(double i) /仅此与例8.1不同 cout“4-In catch block1 an int type is“iendl; cout“5-After Catch.“; ,8.3 异常与函数,8.3.1 在函数中处理异常 异常处理可以局部化为一个函数
9、,当每次进行该函数的调用时,异常将被重置。 【例8-3】 temperture是一个检测温度异常的函数,当温度达到冰点或沸点时产生异常。 #include using namespace std; void temperature(int t) try if(t=100) throw “沸点!“; else if(t=0) throw “冰点!“; else cout“the temperature is OK.“endl; catch(int x)cout“temperatore=“xendl; catch(char *s)coutsendl; void main() temperature
10、(0); temperature(10); temperature(100); ,冰点! the temperature is OK. 沸点!,8.3.2 在函数调用中完成异常处理,将产生异常的程序代码放在一个函数中,将检测处理异常的函数代码放在另一个函数中,能让异常处理更具灵活性和实用性。 【例8-4】 异常处理从函数中独立出来,由调用函数完成。 #include using namespace std; void temperature(int t) if(t=100) throw “沸点!“; else if(t=0) throw “冰点!“; else cout“the tempera
11、ture is .“tendl; void main() try temperature(10); temperature(50); temperature(100); catch(char *s)coutsendl; ,the temperature is .10 the temperature is .50 沸点!,8.3.3 限制函数异常,限制异常的方法 1、当一个函数声明中不带任何异常描述时,它可以抛出任何异常。例如: int f(int,char); /函数f可以抛出任何异常 2、在函数声明的后面添加一个throw参数表,在其中指定函数可以抛出的异常类型。例如: int g(int,
12、char) throw(int,char); /只允许抛出int和char异常 3、指定throw限制表为不包括任何类型的空表,不允许函数抛出任何异常。如: int h(int,char) throw(); /不允许抛出任何异常,【例8-5】 设计函数Errhandler,限制它只能抛出int、char和double类型的异常。 /Eg8-5.cpp #include using namespace std; void Errhandler(int n) throw(int,char,double) if(n=1) throw n; if(n=2) throw x; if(n=3) throw
13、 1.1; void main() cout“Before Errhander.“endl; try Errhandler(1); catch(int i) cout“catch an integer.“endl; catch(char c)cout“catch an char.“endl; catch(double d)cout“catch an double.“endl; ,Before Errhander. catch an integer,8.4 异常处理的几种特殊情况,8.4.1 捕获所有异常 在多数情况下,catch都只用于捕获某种特定类型的异常,但它也具有捕获全部异常的能力。其形
14、式如下: catch() /异常处理代码 ,【例8-6】 改写前面的Errhandler函数,使之能够捕获所有异常。 /Eg8-6.cpp #include using namespace std; void Errhandler(int n)throw() try if(n=1) throw n; if(n=2) throw “dx“; if(n=3) throw 1.1; catch()cout“catch an exception.“endl; void main() Errhandler(1); Errhandler(2); Errhandler(3); ,catch an excep
15、tion. catch an exception. catch an exception,8.4.2 再次抛出异常,如是catch块无法处理捕获的异常,它可以将该异常再次抛出,使异常能够在恰当的地方被处理。再次抛出的异常不会再被同一个catch块所捕获,它将被传递给外部的catch块处理。要在catch块中再次抛出同一异常,只需在该catch块中添加不带任何参数的throw语句即可。,【例8-7】 在异常处理块中再次抛出同一异常。 /Eg8-7.cpp #include using namespace std; void Errhandler(int n) try if(n=1) throw
16、n; cout“all is ok.“endl; catch(int n) cout“catch an int exception inside.“nendl; throw; /再次抛出本catch捕获的异常 void main() tryErrhandler(1); catch(int x) cout“catch int an exception in main.“xendl; cout“End.“endl; ,catch an int exception inside.1 catch int an exception in main.1 End,8.4.3 异常的嵌套调用,try块可以嵌套
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 异常
链接地址:https://www.31doc.com/p-3285138.html