首页 > 代码库 > SEH 结构化异常
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并不会导致额外开销
SEH 结构化异常