try-finally 语句 (C)

Microsoft 专用

try-finally 语句是 C 语言的 Microsoft 扩展,用于使应用程序能够在代码块的执行被中断时保证清理代码的执行。 清理包括多个任务,如释放内存、关闭文件和释放文件句柄。 try-finally 语句对此类例程特别有用:具有几个位置,在这些位置上执行了检查以找出可能导致例程提前返回内容的错误。

try-finally-statement:
__try compound-statement __finally compound-statement

__try 子句后的复合语句是受保护节。 __finally 子句后的复合语句是终止处理程序。 处理程序将指定在退出受保护节时要执行的一系列操作。 无论受保护节是由异常(异常终止)还是由标准贯穿(正常终止)退出,都没有问题。

控制权通过简单的顺序执行(贯穿)传递到 __try 语句。 当控制权交给 __try 语句时,其关联的处理程序将变为活动状态。 执行过程如下所示:

  1. 执行受保护节。

  2. 调用终止处理程序。

  3. 当终止处理程序完成时,执行在 __finally 语句后继续。 无论受保护节如何结束(例如,通过受保护的主体外部的 goto 语句或通过 return 语句),终止处理程序都在控制流移出受保护节之前执行。

__leave 关键字在 try-finally 语句块中有效。 __leave 的效果是跳转到 try-finally 块的末尾。 终止处理程序将立即执行。 尽管可使用 goto 语句来达到相同的结果,但 goto 语句会导致堆栈展开。 由于 __leave 语句不涉及堆栈展开,因此更有效。

使用 try-finally 语句或 return 运行时函数退出 longjmp 语句被视为异常终止。 跳转到 __try 语句是非法的,但跳出该语句是合法的。 必须运行在起点和终点之间处于活动状态的所有 __finally 语句。 这称为“局部展开”。

如果在执行 try-finally 语句时取消了进程,则不会调用终止处理程序。

注意

结构化异常处理适用于 C 和 C++ 源文件。 但是,这不是专门为 C++ 设计的。 对于可移植 C++ 程序,应使用 C++ 异常处理,而不是结构化异常处理。 此外,C++ 异常处理机制灵活得多,因为它可以处理任何类型的异常。 有关详细信息,请参阅《C++ 语言参考》中的异常处理

请参阅 try-except 语句的示例以了解 try-finally 语句如何运行。

结束 Microsoft 专用

另请参阅

try-finally 语句 (C++)