try-finally 语句 (C)
Microsoft 专用
try-finally
语句是 C 语言的 Microsoft 扩展,用于使应用程序能够在代码块的执行被中断时保证清理代码的执行。 清理包括多个任务,如释放内存、关闭文件和释放文件句柄。 try-finally
语句对此类例程特别有用:具有几个位置,在这些位置上执行了检查以找出可能导致例程提前返回内容的错误。
try-finally-statement
:
__try
compound-statement
__finally
compound-statement
__try
子句后的复合语句是受保护节。 __finally
子句后的复合语句是终止处理程序。 处理程序将指定在退出受保护节时要执行的一系列操作。 无论受保护节是由异常(异常终止)还是由标准贯穿(正常终止)退出,都没有问题。
控制权通过简单的顺序执行(贯穿)传递到 __try
语句。 当控制权交给 __try
语句时,其关联的处理程序将变为活动状态。 执行过程如下所示:
执行受保护节。
调用终止处理程序。
当终止处理程序完成时,执行在
__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 专用