- 1、本文档共77页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象教程第十章.pdf
第十章 异常处理
(C)2007首都师范大学信息工程学院
程序的错误有两大类:
①编译链接错误:这类错误是由程序的语法错误 (例
如关键字错误、变量未定义、语句结束缺分号、括
号失配、结构失配等)和其他错误 (函数只声明未
定义、缺少库的链接配置等)引起的。这类程序错
误发生在程序的编译链接过程中误发生在程序的编译链接过程中,,对于一个具有一对于一个具有一
定经验的编程人员是容易解决的。
②运行错误:这类程序错误发生在程序的运行期间,
主要表现在计算过程中的被0除、内存空间不足、数
据的输入输出错误等。这类程序错误只靠编程人员
的经验是难以避免的。
(C)2007首都师范大学信息工程学院
错误修复技术是解决程序运行错误,提高代码健壮
性的最有效方法之一。C 语言实现出错处理的方法是
出错与错误处理的紧耦合,即检查被调函数的返回值
或输出信息,以便确定是否发生错误,作出相应的处
理。这种出错处理存在两个主要问题:
出错处理的繁琐和错误检查引起的出错处理的繁琐和错误检查引起的代码膨胀代码膨胀将不可避将不可避
免地降低程序的执行效率,增加程序的阅读困难。
被调用函数只清楚出错原因而不清楚被调用环境,因
此缺乏处理错误的依据。因此这种将用户函数与出
错处理紧密结合的方法将造成使用出错处理的不方
便和难以接受。
(C)2007首都师范大学信息工程学院
正是因为上述原因,使得不少程序设计人员在实际
设计中常常 “忽略”出错处理,似乎是在 “不会出错”
的状
态下编程,这会严重地降低程序代码的健壮性。
异常处理是C++ 语言的一个重要特征,它提出了出
错处理更加完美的方法错处理更加完美的方法。。
出错处理代码的编写不再繁琐,也不须将出错处理代
码与 “通常”功能代码紧密结合。在可能发生错误
的函
数中加入出错代码,并在后面调用该函数的程序中
加入错误处理代码。如果程序中多次调用一个函数,
可以在程序中加入一个专门用于被调函数的出
(C)2007首都师范大学信息工程学院
错误发生是不会被忽略的。如果被调用函数需发送
一条出错信息给调用函数,它可向调用环境发送一
个描述错误信息的对象。如果调用环境没有捕获该
错误信息对象,则该错误信息对象会被自动向上一
层的层的调用环境调用环境发送发送;;如果如果调用环境调用环境无法无法处理处理该该错误错误
信息对象,则调用环境可以将该错误信息对象主动
发送到上一层的调用环境中;直到该错误信息对象
被捕捉和处理。
(C)2007首都师范大学信息工程学院
10.1 C 语言的出错处理
在通过对被调用函数的返回或对断言宏assert() 的判
断结果的检查能够确切定后续操作的情况下,出错处
理就变得十分明确和容易了,因为可以通过程序执行
的当前运行环境得到所有必要的信息。然而能够这样
处理的错误都是环境一般都是简单的普通错误。
如果错误问题发生时,在程序当前运行环境中无法
获得足够的错误发生和处理的信息,则需要从更大的
运行环境中获取出错处理信息。C 语言处理这类错误
情况的典型方法有三种:
(C)2007首都师范大学信息工程学院
⑴出错信息可以通过函数的返回值获得。如果返回值
不足以描述出错信息,则可设置全局错误判断标志
(标准C 语言中全局变量errno 以及系统运行库函
数perror(const char *string) 、strerror(int errnum) 支持这
一方法一方法))。。由于这种方法要对每个函数调用都进行错由于这种方法要对每个函数调用都进行错
误检查,这将十分繁琐并增加程序的混乱度。另
外,偶然出现异常的函数返回值可能并不反映什麽
问题。
(C)2007首都师范大学信息工程学院
⑵可使用C 信号处理库中的signal 函数设置中断信号
处理,和使用raise 函数向正在运行的程序发送信
号。这两个函数的原型如下:
void(*signal(int sig,
void(__cdecl *func)(int sig[, int subcode])) )
(int sig);
int raise( int sig );
文档评论(0)