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语句的工作原理。

特定于 END Microsoft

另请参阅

try-finally 语句 (C++)