结构化异常处理,,什么是结构化异常处理,结构化异常处理: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; dwTemp += 10; __except ( /*3333*/EXCEPTION_EXECUTE_HANDLER) //444444444 MessageBeep(0); //5555555 return dwTemp;//Continue Process wont be terminatted ,EXCEPTION_CONTINUE_EXECUTION,它表示: 从刚才产生异常的那条指令开始恢复执行。
注意:返回这个值时请小心!因为如果产生异常的地方没有被处理,那么,就会不停的产生异常,然后,except块不停的重复执行该异常,导致死循环!,EXCEPTION_CONTINUE_SEARCH,它会通知系统去查找前一个try 模块并且调用前一个try模块的异常处理器 如果没有找到则为一个未处理的异常,进程将被终止 此处应注意:如果在系统上,如果用户安装了.,则会出现弹出对话框叫用户调试,或关闭该程序异常处理,语言也支持异常处理,但是它是针对语言的 C++的异常处理语法如下: Try ..try body Throw 5; Catch(int x) //catch body ,C++异常与的区别,C++异常处理是不支持程序从硬件异常中恢复出来的 但是6.0已经把这个功能加了上去因此,如果使用在平台开发程序,两者是没有差别的但是,如果使用其他的编译器则需要注意了 推荐,使用处理异常,而用辅助处理硬件异常Q & A,Thanks for attending,。