异常处理
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会创建关于未处理异常及其执行上下文的错误报告。