SEH 结构化异常

Structured Exception Handling是windows特有的异常处理,SEH包含了两个方面的功能:
• 终止处理
• 异常处理


终止处理:
终止处理确保无论被保护代码是如何退出的,另一个代码块总能被调用和执行:
__try
{
//Guarded Body

}
__finally
{
//Termination handler

}

无论在被保护代码中使用了return还是goto,亦或者longjump(除非调用了ExitProcess, EixtThread, TerminateProcess, TerminateThread),终止处理程序被调用,即__finally代码块都能执行。

不建议在try块中使用break,goto,return,continue,这会损失性能增加代码量

有一种值得注意的情况:
Void foo()
{
__try
{
Bar();
{
__finally
{
}
}

此时如果bar发生了异常,在vista以后的系统上foo里的finally不会默认进行全局展开finally里的代码不会执行,全局展开(全局展开是发生在嵌套出现的try-finally和try-except之间)的触发由下面介绍的except的filter返回值决定

异常处理:
终止处理确保无论被保护代码是如何退出的,另一个代码块总能被调用和执行,而异常处理定义了发生异常后,如何执行我们的自定义动作(如果程序正常执行,那么异常处理程序不会被调用):
__try
{
//Guarded Body

}
__expect (exception filter)
{
//Exception handler

}

注意:任何时候创建一个__try块,后面必须跟一个finally代码块或except代码块。try后绝对不能同时又finally和except,也不能有多个finally或多个except,可以将try-finally和try-except互相嵌套。

不同于上面的终止处理程序,在异常处理程序try中使用return,goto,continue,break并不会导致额外开销

 

 

posted @ 2017-04-24 08:44  llluiop  阅读(159)  评论(-2编辑  收藏  举报