尝试最终语句

Microsoft 专用

以下语法来描述 try-finally 语句:

__try {
   // guarded code
}
__finally {
   // termination code
}

语法

  • 尝试最终语句:
    __try 复合语句

    __finally 复合语句

try-finally 语句是 Microsoft 对启用目标应用程序确保清理代码执行的 C 和 C++ 语言,用于中断代码块的执行。 清理包括此任务与释放内存,如用于关闭文件和释放文件句柄。 try-finally 语句为具有若干位置检查对错误进行了会导致过早从实例返回的实例尤其有用。

有关相关信息和代码示例,请参见 尝试除语句。 有关结构化通常,异常处理的更多信息 结构化异常处理请参见。 有关处理在托管应用程序的异常的更多信息,请参见 异常处理在 /clr 下

备注

结构化异常处理与 C 和 C++ 的 Win32 使用源文件。但是,对于 C++ 不专门设计。可以确保代码是可移植使用 C++ 异常处理。此外, C++ 异常处理更为灵活,因为它可以任何类型的异常。对于 C++ 程序,建议您使用异常处理机制 (尝试,捕获,并引发 语句) 的 C++。

复合语句,在 __try 子句是所控制的部分中。 在 __finally 子句后的复合语句是终止处理程序。 处理程序指定执行的一组操作所控制的部分退出时,无论所控制的部分是否由异常 (不正常终止) 退出,也不会将失败 (正常终止)。

控件按简单的顺序执行到达 __try 语句 (将失败)。 在控件中输入 __try时,其关联的处理程序变为活动状态。 如果控制流到达在尝试块的结尾,执行如下所示:

  1. 终止处理程序调用。

  2. 在终止处理程序完成时,会在 __finally 语句之后继续。 无论所控制的部分的结束方式 (例如,通过在控制体或 return 语句之外的 goto ),终止处理程序是控制流从所控制的部分中执行的 before 。

    __finally 语句不阻止搜索适当的异常处理程序。

如果在 __try 发生块,操作系统必须找到异常或过程的处理程序将失败。 如果已找到该处理程序,随机 __finally 块在处理程序中执行和继续执行。

例如,假设如下图所示,一系列函数调用 LINK 函数的函数, " D。 每个功能都有一终止处理程序。 如果在函数 D 中引发和处理,终止处理程序的调用顺序如下,当系统展开堆栈:D, C, B。

终止处理程序执行顺序

处理程序执行顺序终止

备注

尝试最终行为与支持使用 最后的其他一些语言不同,例如 C#。唯一 __try 可以具有之一,但是,不是两个, __finally 和 __except。如果将同时使用两者,一个外部尝试除语句必须将内部尝试最终语句。指定规则中,当每个块执行时也不同。

__leave 关键字

__leave 关键字在 try-finally 语句中的控制的节中有效的,因此,其效果是跳转到控制的末尾。 继续执行在终止处理程序的第一个语句。

goto 语句还可以跳出所控制的部分,但是,它会降低性能,因为它调用堆栈展开。 ,因为它不会导致堆栈解散, __leave 语句的效率更高。

异常终止

退出 try-finally 语句使用 longjmp 运行时函数被视为不正常终止。 阅读本文档 __try 语句,但是,合法跳出一是非法的。 是一个起点之间的所有 __finally 语句 ( __try 的正常终止块),并且必须运行该目标 ( __except 块处理异常)。 这称为展开局部堆栈。

如果 尝试 块由于某种原因提前终止,包括跳出块,该系统执行关联的 最后 块作为堆栈展开过程的一部分。 在这种情况下, AbnormalTermination 函数返回 TRUE,则调用从 最后 的内部块;否则,它将返回错误。

,如果处理在执行 try-finally 语句元,将杀害停止未调用处理程序。

特定于 Microsoft 的结尾

请参见

参考

编写终止处理程序

结构化异常处理(C++)

C++关键字

Termination-Handler Syntax