欢迎来到天天文库
浏览记录
ID:48061692
大小:118.00 KB
页数:24页
时间:2020-01-13
《c++课件第十二章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第12章异常处理内容概览异常处理的概念异常处理的基本思想异常处理的实现异常处理的规则异常事件的多路捕捉异常处理机制使用异常处理的方法小结12.1异常处理的概念在大型软件开发中,最大的问题就是错误连篇的、不稳定的代码。而在设计与实现中,最大的开销是花在测试、查找和修改错误上。程序的错误,一种是编译错误,即语法错误。如果使用了错误的语法、函数、结构和类,程序就无法被生成运行代码。另一种是在运行时发生的错误,它分为不可预测的逻辑错误和可以预料的运行异常。逻辑错误是由于不当的设计造成的,例如,某个排序算法的不合适,导致在
2、边界条件下,不能正常完成排序任务。一般只有当用户做了某些出乎意料的事才会出现逻辑错误,这些错误,安静地潜伏着,连许多大型的优秀软件都不能避免。就像大战之后残留的地雷,在“一切正常“中,突然某人进入了误区,程序发生了”爆炸“。一旦发现了逻辑错误,专门为其写一段处理错误的代码,就可以避免错误的发生,比如数组下标溢出检查,这样错误就防范在先了。运行异常,可以预料,但不能避免。它是由系统运行环境造成的。如,内存空间不足,而程序运行中提出内存分配申请时,得不到满足,就会发生异常;在硬盘上的文件被挪离,或者软盘没有放好,导致
3、程序运行中文件打不开而发生异常;程序中发生除0的代码,导致系统除0中断;打印机未打开,调制解调器掉线等,导致程序运行中挂接这些设备失败,等等。这些错误会使程序变得脆弱。然而这些错误是能够预料的,通常加入一些预防代码便可防止这些异常的发生。异常是一种程序定义的错误,它对程序的逻辑错误进行设防的,对运行异常加以控制。C++中,异常处理是对所能预料的运行错误进行处理的一套实现机制。12.2异常处理的基本思想在大型程序中,一旦发生异常,一般是将程序立即中断运行,从而无条件释放所有资源。对于大型程序来说,运行中一旦发生异常
4、,应该允许恢复和继续运行。恢复的过程就是把产生异常所造成的恶劣影响去掉,中间可以要涉及一系列的函数调用链的退栈,对象的析构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。在C++中,异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象。如图1所示。发生异常的地方在函数k()中,处理异常的地方在其上层函数f()中,处理异常后,函数k()和g()都退栈,然后程序在函数f()中继续运行。如果不用异常处理机制,在程序中单纯地嵌入错误处理语句,要实现这一目的是艰难的。异常处理的基本
5、思想是:(1)实际的资源分配(如内存申请或文件打开)通常在程序的低层进行,如图12-1中的k()。(2)当操作失败,无法分配内存或无法打开一个文件时,在逻辑上如何进行处理通常是在程序的高层,如图12-1中的f(),中间还可能有与用户的对话。(3)异常为从分配资源的代码转向处理错误状态的代码提供了一种表达方式。如果还存在中间层次的函数,如图12-1中的g(),则为它们释放所分配的内存提供了机会,但这并不包括用于传递错误状态信息的代码。可以看出,C++异常处理的目的,是在异常发生时,尽可能地减小破坏,周密地善后,而不
6、影响其他部分程序的运行。这在大型程序中是非常必要。12.3异常处理的实现使用异常处理的步骤如下:(1)定义异常(try语句块)将那些有可能产生错误的语句框定在try块中。(2)定义异常处理(catch语句块)将异常处理的语句放在catch块中,以便异常处理被传递过来时就处理它。(3)抛掷异常(throw语句)检测是否产生异常,如果是,则抛掷异常。12.4异常处理的规则以catch开始的程序块是异常处理程序,编写异常处理程序的规则是:(1)任意数量的catch分程序立即出现在try分程序之后。在try分程序出现后前
7、,不能出现这些catch程序块。(2)在catch行的圆括号中可包含数据类型声明,它与函数定义中参数声明起的作用相同。应该把异常处理catch块看作是函数分程序。跟在catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。在数据类型之后放参数名是可选的。参数名使得被捕获的对象在处理程序分程序中被引用。(3)如果一个函数抛掷一个异常,但在通往异常处理函数的调用链中找不到与之匹配的catch,则该程序通常以abort()函数调用终止。(4)如果catch分程序执行完毕,则跟随最后catch分程序的代码
8、(如果有的话)就被执行。12.5异常事件的多路捕获多数程序可能有若干不同种类的运行错误,它们可以用异常处理机制。每种错误可与一个类、一个数据类型或一个值有关。这样,在程序中就会出现多路捕获。12.6异常处理机制在处理程序和语句之间的相互作用使异常在大型应用程序中变得复杂。通常人们希望抛掷被及时捕获,以避免程序突然终止。此外,跟踪抛掷很重要,因为捕获确定该程序的后继进展。例
此文档下载收益归作者所有