Termination-Handler语法

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

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

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

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

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

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

__finally块在终止处理程序所在的函数的上下文中执行。 这意味着 __finally 块可以访问该函数的局部变量。 执行__finally块可以通过以下任何方式终止。

  • 执行块中的最后一个语句并延续到下一个指令
  • 使用控件语句 (返回中断继续goto)
  • 使用 longjmp 或跳转到异常处理程序

如果由于调用基于帧的异常处理程序的异常而终止 __try 块的执行,则会在执行异常处理块之前执行 __finally 块。 同样,从 __try 块调用 longjmp C 运行时库函数会导致执行__finally块,然后再在 longjmp 操作的目标处恢复执行。 如果 由于 控制语句 (返回中断继续goto) 而终止__try块执行,则执行 __finally 块。

异常终止函数可以在__finally块中使用,以确定__try块是否按顺序终止,即是否到达右大括号 (}) 。 由于调用 longjmp、跳转到异常处理程序或返回中断继续goto 语句,离开__try块被视为异常终止。 请注意,未能按顺序终止会导致系统反向搜索所有堆栈帧,以确定是否必须调用任何终止处理程序。 这可能会导致性能下降,因为执行了数百条指令。

为了避免终止处理程序异常终止,执行应继续到块的末尾。 还可以执行 __leave 语句。 __leave语句允许立即终止__try块,而不会造成异常终止及其性能处罚。 检查编译器文档以确定是否支持 __leave 语句。

如果由于返回控件语句而终止__finally块的执行,则等效于封闭函数中右大括号的 goto。 因此,封闭函数将返回。