try-except 语句 (C)

Microsoft 专用

try-except 语句是 C 语言的Microsoft扩展,使应用程序能够在正常终止执行的事件时控制程序。 此类事件称为异常,处理异常的机制称为结构化异常处理。

异常可能是基于硬件或基于软件的。 即使应用程序无法完全从硬件或软件异常中恢复,结构化异常处理也能记录和显示错误信息。 捕获应用程序的内部状态有助于诊断问题非常有用。 特别是,这对间歇性问题非常有用,这些问题不容易重现。

语法

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

子句后面的 __try 复合语句是 受保护的节。 子句后面的 __except 复合语句是 异常处理程序。 处理程序指定在执行受保护的节期间引发异常时要执行的作集。 执行继续,如下所示:

  1. 执行受保护的节。

  2. 如果在执行受保护的节期间未发生异常,则子句后 __except 语句将继续执行。

  3. 如果在执行受保护的节期间或受保护的节调用的任何例程中发生异常,则 __except 计算表达式。 返回的值确定异常的处理方式。 有三种可能的值:

    • EXCEPTION_CONTINUE_SEARCH:无法识别异常。 继续搜索处理程序的堆栈,首先搜索包含 try-except 语句,然后搜索具有下一个最高优先级的处理程序。

    • EXCEPTION_CONTINUE_EXECUTION:已识别异常,但已消除。 在发生异常时继续执行。

    • EXCEPTION_EXECUTE_HANDLER 识别异常。 通过执行 __except 复合语句将控制权传输到异常处理程序,然后在发生异常时继续执行。

__except由于表达式的计算结果为 C 表达式,因此限制为单个值、条件表达式运算符或逗号运算符。 如果需要更广泛的处理,表达式可以调用一个例程,该例程返回上面列出的三个值之一。

注释

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

应用程序中的每个例程都可以有自己的异常处理程序。 表达式 __except 在正文的范围内 __try 执行。 它有权访问其中声明的任何局部变量。

关键字 __leave 在语句块中 try-except 有效。 其效果 __leave 是跳转到块的 try-except 末尾。 执行将在异常处理程序结束之后恢复。 goto尽管语句可用于完成相同的结果,但goto语句会导致堆栈展开。 该 __leave 语句更高效,因为它不涉及堆栈展开。

try-except使用longjmp运行时函数退出语句被视为异常终止。 跳入一 __try 份声明是不合法的,但从一份声明中跳出来是合法的。 如果在执行 try-except 语句的过程中终止进程,则不会调用异常处理程序。

示例:

下面是异常处理程序和终止处理程序的示例。 有关终止处理程序的详细信息,请参阅 try-finally 语句 (C)

.
.
.
puts("hello");
__try {
   puts("in try");
   __try {
      puts("in try");
      RAISE_AN_EXCEPTION();
   } __finally {
      puts("in finally");
   }
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
   puts("in except");
}
puts("world");

下面是示例的输出,右侧添加了注释:

hello
in try              /* fall into try                        */
in try              /* fall into nested try                 */
in filter           /* execute filter; returns 1 so accept  */
in finally          /* unwind nested finally                */
in except           /* transfer control to selected handler */
world               /* flow out of handler                  */

特定于 END Microsoft

另请参阅

try-except 语句 (C++)