- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
软件工程异常处理
计算机与信息工程学院 异常处理 主要内容 在编写程序时,应该试着确定程序可能出现的错误,然后加入处理错误的代码。 随着程序复杂性的增加,为处理错误而必须包括在程序中代码的复杂性也增加了。 为使程序更易于测试和处理错误,C++实现了异常处理机制。 本章介绍了C++异常处理。程序使用try,throw和catch语句来支持异常处理。 21.1 异常的概念 在大型软件开发中,最大的问题就是错误连篇的,不稳定的代码。而在设计与实现中,最大的开销是花在测试,查找和修改错误上。 程序的错误,一种是编译错误,即语法错误。另一种是运行时发生的错误。可以分为不可预料的逻辑错误和可以预料的运行异常。 逻辑错误是由于不当的设计造成的。一般只有用户做了某些出乎意料的事才会出现。 运行异常,可以预料,但不能避免,它是由于不当的设计造成的。这些错误会使程序变的脆弱。然而这些错误是能够预料的,通常加入一些预防代码便可防止这些异常。 异常是一种程序定义的错误,它对逻辑错误进行防范,对运行异常加以控制。在C++中,异常是对所能预料的运行错误进行处理的一套实现机制。 21.2 异常的基本思想 在小型程序中,一旦发生异常,一般是将程序立即中断运行,从而无条件释放所有资源。 对于大型程序来说,运行中一旦发生异常,应该允许恢复和继续运行。 恢复的过程是把产生异常所造成的恶略影响去掉,中间可能要涉及一系列的函数调用链的推栈,对象的折构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。 在C++中,异常是指从发生问题的代码区域传递到处理问题的代码区域的一个对象。 异常的发生、传递和处理基本思想 21.2 异常的基本思想 异常的基本思想是: 实际的资源分配(如内存申请或文件打开)通常在程序的低层进行,如上图中的K()。 当操作失败,无法分配内存或无法打开一个文件时,在逻辑上如何进行处理通常是在程序的高层,如上图中的f(),中间还可能有与用户的对话。 异常为从分配资源的代码转向处理错误状态的代码提供了一种表达方式。如果还存在中间层次的函数,如上图中的g(),则为它们释放所分配的内存提供了机会,但这并不包括用于传递错误状态信息的代码。 C++处理异常的目的:在异常发生时,尽可能地减少破坏,周密地善后,而不去影响其他部分程序的运行。 21.3 异常的实现 使用异常的步骤是: 定义异常(try语句块) 将那些有可能产生错误的语句框定在try块中; 定义异常处理(catch语句块) 将异常处理的语句放在catch块中,以便异常被传递过来时就处理它; 抛掷异常(throw语句) 检测是否产生异常,若是,则抛掷异常。 例如:下面的程序,设置了防备文件打不开的异常:ch21_1.cpp 21.3 异常的实现 在try块之后必须紧跟一个或多哥catch()语句,目的时对发生的异常进行处理。catch()括号中的声明只能容纳一个形参,当类型与抛掷异常的类型匹配时,该catch()块便称捕获了一个异常而转到其块中进行异常处理。 可以将抛掷异常与处理异常放在不同的函数中。 例如,下面定义了一个除零异常: ch21_2.cpp 21.4 异常的规则 以catch开始的程序块是异常处理程序,编写异常处理程序的规则是: 任意数量的catch分程序立即出现在try分程序之后。在try分程序之前,不能出现catch程序块。 在catch行的圆括号中可包含数据类型声明,它与函数定义中参数声明起的作用相同。应把异常处理catch块看作是函数分程序。跟在catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。在数据类型之后放参数名是可选的。参数名使得被捕获的对象在处理程序分程序中被引用。 如果一个函数抛挣一个异常,但在通往异常处理函数的调用链中找不到与之匹配catch,则该程序通常以abort()函数调用终止。 如果catch分程序执行完毕,则跟随最后catch分程序的代码(如果有的话)就被执行。 21.5 多路捕获 多数程序可能有若干不同种类的运行错误,它们可以用异常处理机制。每个错误可与一个类,一个数据类型或一个值有关。这样,在程序中就会出现多路捕获。 例如,操作String类对象时,预设两个异常: 21.6 异常处理机制 在处理程序和语句之间相互作用使异常在大型应用程序中变得复杂。人们希望抛掷被及时捕获,以避免程序突然终止。 例如:下面程序说明了异常处理机制。 在函数调用链中的异常处理 21.7 使用异常的方法 可以把多个异常组成族系。构成异常族系的一些示例有数学错误异常族系和文件处理异常族系。 在C++代码中把异常组在一起有两种方式:异常枚举族系和异常派生层次结构。例如: 异常捕获规则必须严格匹配数据类型。对于类的派生,下列情况可以捕获异常:
文档评论(0)