作者:shenzi
链接:http://blog.youkuaiyun.com/shenzi
使用SEH,并不意味着可以完全忽略代码中可能出现的错误,但是我们可以将软件主要功能编写和软件异常情况处理这两个任务分离开。这样就可以先集中注意力完成手头上的工作,稍后再去处理软件可能会遇到的各种错误情况。
SEH实际上包含两方面的功能:终止处理(termination handling)和异常处理(exception handling)。
1.终止处理
终止处理程序确保不管一个代码块(被保护代码(the guarded body))是如何退出的,另一个代码块(终止处理程序)总能被调用和执行。终止处理的语法(当使用Microsoft Visual C++编译器时)如下所示:
__try {
// Guarded body
被保护代码
...
}
__finally {
// Termination handler
终止处理程序
...
}
在这段代码中,操作系统和编译器的协同工作保证了不管被保护代码部分是如何退出的——无论我们在被保护代码中使用了return,还是goto,又或者longjump语句(除非调用ExitProcess , ExitThread , TerminateProcess , 或TerminateThread 来终止进程或线程)——终止处理程序都会被调用,即 __finally 代码块都能执行。
一条好的经验法则是,不要在终止处理程序里包含让try块提前退出的语句,这意味着从try块和finally块中移除return,continue,break,goto等语句,即把这些语句放在终止处理程序之外。
当系统因为try代码块中的代码提前退出而执行finally代码块时,就会发生局部展开。需要注意的是,应该避免在try代码块中使用return语句,因为这对应用程序性能是有害的。