- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第八章 异常处理与静态库动态库 主要内容 8.0 程序错误 8.1 断言机制 8.2 异常处理 8.3 namespace 8.4 使用C的头文件和库 8.5 静态链接库 8.6 动态链接库 8.0 程序错误 8.0 程序错误 编程是一件复杂的工作,因为是人做的事情,所以难免经常出错(bug)。程序产生的错误通常分为 8.0 程序错误 程序异常(Exception)是指程序出现了一些很少发生的或出乎意料的状态,通常必须提供一个回应,否则,将造成程序功能削弱或死亡,有时导致整个系统和程序自身一起down掉,例如:磁盘满、内存耗尽、被0除等。 异常处理并不完全等同于对出错的处理,指的是对运行时出现的差错及其他例外情况的处理。 8.0 程序错误 常用的异常处理方式 1. 使用判断语句来进行,下面是C语言程序的代码: #include stdio.h void main(){ FILE *p; if( (p=fopen(data.dat,w) )==NULL ) { printf(\\nCan not create file!\n); return; } else{ …} } 8.0 程序错误 常用的异常处理方式 1.返回值/回传参数 其存在着一个致命的问题:返回值/回传参数的检查与否是由调用者决定。 2.全局状态标示符 同样需要调用者主动检查,且由于其是全局的,在多线程程序中,还必须保证它的线程安全性。 8.0 程序错误 常用的异常处理方式 3.setjmp()/longjmp() 看作”远程的goto语句“进行调用,该函数破坏结构化程序设计风格,longjmp()只能处理int型的异常,最致命的是longjmp()不会调用析构函数因此,在C++中不能使用setjmp()、longjmp()函数。 4.断言 对于断言(Assertion) 其仅仅在Debug版本中起作用,在Release中其是不存在的。 5. SEH( Structured Exception Handling)和C++异常机制 C与C++中的异常处理/bbsdetail_23867.html 8.1 断言机制(assertion) 8.1 断言机制 #includeiostream #include assert using namespace std; int Div(int x,int y) { assert(y!=0); return x/y; } int main() { cout5/2=Div(5,2)endl; cout8/0=Div(8,0)endl; return 0; } 8.1 断言机制(1) 断言是一个包含布尔表达式的语句,在执行这个语句时,假定该表达式为 true。如果表达式计算为 false,系统通常会报告错误并终止程序。一般只在程序调试时,才启用断言. 断言主要有以下几方面作用: 保证程序的正确性与健壮性 断言可用于形成程序的文档 支持程序的动态调试 构成异常处理基础 8.1 断言机制(2) C++的断言assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。在运行过程中,如果assert的参数为假,那么程序就会中止(一般还会出现提示对话框,说明在什么地方引发了assert)。 程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。 8.1 断言机制(3) 设计断言注意事项: 为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。 程序员有时也会犯错误:所设计的断言含有错误。 如果断言有错误,就可能会发生最令人沮丧的事:花了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么. 如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。 为了避免发生这种由于断言错误,使调用者跟踪到程序的断言,却搞不清该断言的作用的情况, 最简单的解决方法就是给断言加上清晰的注释。 8.1 断言机制(3) 摘自assert.h #ifdef NDEBUG #define assert(exp) ((void)0) #else #ifdef __cplusplus extern C { #endif _CRTIMP void __cdecl \ _assert(void *, void *, unsigned);//
您可能关注的文档
最近下载
- 人教版道德与法治三年级上册第10课《公共场所的文明素养》第1课时 公共场所在哪里 教学课件.pptx VIP
- 预应力混凝土折线形屋架施工技术.pdf VIP
- 2019年新版GB T50502《建筑施工组织设计规范》.pdf VIP
- 人教版初中足球教学教案大全1.doc VIP
- 河北省专业技术职务任职资格考核认定表.doc VIP
- 新视野大学英语(第三版)读写教程BookI-Unit1-Section A-Toward a brighter future for all.ppt VIP
- 在线分析仪表专题培训课件.ppt VIP
- 任务认识布线缆线及其连接件.pptx VIP
- 投资人工智能领域核心标的:易方达中证人工智能ETF投资价值分析-20200925-国信证券-23页.pdf VIP
- 软件安装调试记录表模板.docx VIP
原创力文档


文档评论(0)