Termination-Handler 语法
__try 和 __finally 关键字用于构造终止处理程序。 下面的示例演示终止处理程序的结构。
__try
{
// guarded body of code
}
__finally
{
// __finally block
}
有关示例,请参阅 使用终止处理程序。
与异常处理程序一样,__try 块和 __finally 块都需要大括号({}),并且不允许使用 goto 语句跳转到任一块。
__try 块包含受终止处理程序保护的代码的受保护的正文。 函数可以具有任意数量的终止处理程序,并且这些终止处理块可以嵌套在同一函数或不同的函数中。
每当控制流离开 __try 块时,将执行 __finally 块。 但是,如果在 __try 块中调用以下任何函数,则不会执行 __finally 块:ExitProcess、ExitThread或 中止。
在终止处理程序所在的函数的上下文中执行 __finally 块。 这意味着 __finally 块可以访问该函数的局部变量。 __finally 块的执行可以通过以下任一方式终止。
- 执行块中的最后一个语句并延续到下一个指令
- 使用控制语句(返回、中断、继续或 goto)
- 使用 longjmp 或跳转到异常处理程序
如果由于调用基于帧的异常处理程序的异常处理块而终止 __try 块的执行,则会在执行异常处理块之前执行 __finally 块。 同样,从 __try 块调用 longjmp C 运行时库函数会导致执行 __finally 块,然后再在执行 longjmp作的目标处恢复执行。 如果 __try 块执行由于控制语句(返回、中断、继续或 goto),则执行 __finally 块。
异常终止 函数可用于 __finally 块中,以确定 __try 块是否按顺序终止,即是否到达右大括号(})。 由于调用 longjmp、跳转到异常处理程序或 返回、中断、继续或 goto 语句的调用而离开 __try 块被视为异常终止。 请注意,未能按顺序终止会导致系统反向搜索所有堆栈帧,以确定是否必须调用任何终止处理程序。 这可能会导致性能下降,因为执行了数百条指令。
为了避免终止处理程序异常终止,执行应继续到块的末尾。 还可以执行 __leave 语句。 __leave 语句允许立即终止 __try 块,而不会造成异常终止及其性能损失。 检查编译器文档以确定是否支持 __leave 语句。
如果 __finally 块的执行由于 返回 控制语句而终止,则它等效于封闭函数中右大括号的 goto。 因此,封闭函数将返回。