异常处理

1、结构化异常处理SEH功能:终止处理、异常处理

2、终止处理程序确保不管被保护代码是如何退出的,终止处理程序都会调用和执行(除非调用ExitProcess、ExitThread、TerminateProcess、TerminateThread),语法:

__try{

//Guarded body

...

}

__finally{

//Termination handler

...

}

3、不要在终止处理程序里包含让try块提前退出的语句,从try块和finally块中移除return,continue,break,goto等语句

4、__leave可以将代码执行控制流跳转到try块的结尾,避免在try块中使用return语句

5、三种会引起finally块执行的情形:

从try块到finally的正常代码控制流;

局部展开:从try块中的提前退出(return语句等),将程序控制流强制转入finally块;

全局展开:在try代码块中调用函数,如果函数中引起内存访问违规或者其他异常,那么将触发finally块执行。

6、由CPU抛出的异常都是硬件异常,操作系统和应用程序抛出的异常称为软件异常

7、异常处理程序语法结构:

__try{

//Guarded body

...

}

__except(exception filter){

//Exception handler

...

}

8、try块后面必须跟finally块和except块,但不能同时存在finally和except块,也不能多个finally块或except块,可以嵌套使用。

9、终止处理程序主要由编译器执行,异常处理程序主要由操作系统执行

10、当except块中代码执行完毕后,代码执行从except块后的第一句代码继续。

11、GetExceptionCode函数的返回值表明刚刚发生的异常的类型,这个函数只能在异常过滤程序中调用。

12、调用RaiseException函数可以抛出一个软件异常。

13、全局异常过滤函数负责处理未处理异常,SetUnhandledExceptionFilter函数用来安装我们自己的全局异常过滤程序,UnhandledExceptionFilter函数为默认过滤程序,该函数在Kernel32.dll中。

14、 AddVectoredExceptionHandler函数负责向量化异常处理程序的注册,当进程中任意线程发生异常时,异常处理程序会被调用。

15、 C++异常中的catch语句对应SEH异常过滤程序,catch块中的代码对应SEH __except块中的代码。

16、当一个进程因为未处理异常而终止时,Windows错误报告WER会创建关于未处理异常及其执行上下文的错误报告。

 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     

posted on 2019-11-26 10:10  Noora&w  阅读(165)  评论(0编辑  收藏  举报