终止处理程序语法

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

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

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

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

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

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

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

  • 执行块中的最后一个语句并延续到下一个指令
  • 使用控制语句(returnbreakcontinuegoto
  • 使用 longjmp 或跳转到异常处理程序

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

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

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

如果由于 return 控制语句而终止 __finally 块的执行,则这相当于一个用于转到封闭函数中的右大括号的 goto。 因此,封闭函数将返回。