Termination-Handler 语法

__try__finally 关键字用于构造终止处理程序。 下面的示例演示终止处理程序的结构。

__try 
{ 
    // guarded body of code 
 
} 
__finally 
{ 
    // __finally block 
 
}

有关示例,请参阅 使用终止处理程序

与异常处理程序一样,__try 块和 __finally 块都需要大括号({}),并且不允许使用 goto 语句跳转到任一块。

__try 块包含受终止处理程序保护的代码的受保护的正文。 函数可以具有任意数量的终止处理程序,并且这些终止处理块可以嵌套在同一函数或不同的函数中。

每当控制流离开 __try 块时,将执行 __finally 块。 但是,如果在 __try 块中调用以下任何函数,则不会执行 __finally 块:ExitProcessExitThread中止

在终止处理程序所在的函数的上下文中执行 __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。 因此,封闭函数将返回。