Microsoft 专用
该 try-finally 语句是 C 语言的Microsoft扩展,使应用程序能够在代码块执行中断时保证执行清理代码。 清理包括解除分配内存、关闭文件和释放文件句柄等任务。 该 try-finally 语句对于具有多个位置的例程特别有用,这些例程检查了可能导致例程过早返回的错误。
try-finally-statement:
__trycompound-statement__finallycompound-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语句的工作原理。
特定于 END Microsoft