- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
结构化异常处理.ppt
结构化异常处理 什么是结构化异常处理 结构化异常处理:SHE(structured exception handling) 由编译器实现的处理结束以及异常的特殊功能。 目的: 是程序更加健壮 适用性: Microsoft Virtual C++ 编译器,以及其他编译器厂商针对Microsoft OS平台开发的编译器下。 SHE的主要功能 结束处理(termination handling) 异常处理(exception handling) 结束处理 结束处理可以保证去调用和执行一段代码而不去管整段被保护的代码是如何退出的。 语法:__try{ // Guarded body } __finally{ // Termination handler } 结束处理基本原理 无论被保护的代码以何种方式退出都会调用finally块的代码。 强制进入finally块的两种情况: 1. 从try 块进入finally 块的正常控制流。 2. 从try 块过早的退出(goto , continue ,break, return etc.)或者出现内存访问违规等异常情况而强制控制转入finally 块。 示例 DWORD FuncExample1(){ DWORD dwTemp = 0; while(dwTemp 10){ __try{ if(2 == dwTemp) 请问:return 的值? continue; if(3 == dwTemp) break; }__finally{ dwTemp++; } dwTemp++; } dwTemp += 10; return dwTemp; } 特殊边界 结束处理的另一个特殊语法以及一个API __leave; 可以直接从保护代码块掉到finally 块中。 BOOL AbnormalTermination(); 只在 finally 块中调用。如果是自然控制流进入 finally 块那么返回FALSE. 反之亦然。 它是一个内部函数(intrinsic function) 异常处理 如果我们的代码中访问了无效内存地址或者用0 来除一个数。那么,就会导致异常的产生。 该线程将被强制退出。 例如一段代码用到数学公式的运算,但是谁都不知道传给该函数的数就有可能导致用0来除一个数这样的情况。那么用异常处理就可以帮助我们捕捉这种异常,然后,跳转到我们的异常处理代码来进行修复。 异常处理原理 任何被保护的代码短如果产生异常都会跳转到 except 块中去执行异常处理。 语法: __try{ //Guarded code } __except(exception filter){ //exception handler } 结束处理与异常处理语法 注意:每一个try 块必须跟一个finally 块或者是except 块。一个try 块后面不能既跟finally 又跟except但是可以这样嵌套若干个。 __try { __try { //code or nested try –finally(except) }__finally{ } } __except (exception filter){ } Exception filter Exception Filter 只能是Excpt.h中定义的三个值之一! #define EXCEPTION_EXECUTE_HANDLER 1 #define EXCEPTION_CONTINUE_SEARCH 0 #define EXCEPTION_CONTINUE_EXECUTION -1 当然也可以通过调用函数判断来返回这些值。在函数里可以通过调用 GetExceptionCode()来判断是哪种错误来决定是否能够处理这个异常,还是认为该异常不影响系统可以继续运行。该API返回值在winbase.h中有定义。 EXCEPTION_EXECUTE_HANDLER 如果Exception filter 的值为EXECUTE_HANDLER则表示:该异常以有编写好的代码来处理,请系统调用处理异常的代码。 显然,如果出现异常,程序会跳到except块中去执行系统认为的异常处理代码。然后,执行except块后的第一条指令。 示例 DWORD Funcmeister1(){ DWORD dwTemp = 0; //111111. __try{ //222222. dwTemp = 5/dwTemp;
文档评论(0)