尝试除语句(c)

Microsoft 专用

尝试除外 语句是 Microsoft 对使应用程序能够对控件进行编程的 C 语言,用于正常终止执行的事件发生时。 此类事件调用异常和事务与异常调用结构化异常处理机制。

异常可能硬件或软件。 即使应用程序无法从硬件或软件异常完全还原,结构化异常处理使您可以显示错误信息并使应用程序的内部状态帮助诊断问题。 这对于不能轻松地重现的间歇性问题特别有用。

语法

  • 尝试除语句:
    __try 复合语句

    __except ( 表达式 ) 复合语句

复合语句,在 __try 子句是所控制的部分中。 在 __except 子句后的复合语句是异常处理程序。 ,如果在所控制的部分,执行引发处理程序指定要执行的一组操作。 执行如下所示:

  1. 所控制的部分执行。

  2. 如果异常不在所控制的部分的执行过程中发生,则继续执行该语句在 __except 子句后。

  3. 如果在所控制的部分的执行过程中发生或任何实例所控制的部分调用,__except 表达式进行计算,然后返回的值确定异常的处理方式。 有三个值:

    EXCEPTION_CONTINUE_SEARCH 异常未被识别。 继续搜索堆栈处理程序,首先包含 尝试除外 语句,然后使用下一个高优先级的处理程序。

    EXCEPTION_CONTINUE_EXECUTION 异常被识别出来,但已关闭。 继续执行在异常发生的点。

    EXCEPTION_EXECUTE_HANDLER 异常被识别。 对于异常处理程序传输控件通过执行 __except 复合语句,然后继续执行在异常发生的点。

由于 __except 表达式计算为 c. 表达式,它仅限于单个值、条件表达式运算符或逗号运算符。 如果需要更多个处理,表达式可以调用返回列表的三个值之一上面的实例。

备注

结构化异常处理与 C 和 C++ 源文件一起使用。但是,对于 C++ 不专门设计。可以确保代码是可移植使用 C++ 异常处理。此外, C++ 异常处理机制更为灵活,因为它可以任何类型的异常。

备注

对 C++ 程序, C++ 应使用异常处理而不是结构化异常处理。有关更多信息,请参见《 C++ 语言的异常处理引用

在应用程序的每个实例都可以具有其自己的异常处理程序。 在 __try 主体范围内, __except 表达式执行。 这意味着它可以访问声明的所有局部变量的存在。

__leave 关键字在 尝试除外 语句内有效的块。 __leave 的效果是跳转到 尝试除外 块的末尾。 执行在异常处理程序的结尾后恢复。 虽然 goto 可以使用语句获得相同的结果, goto 语句导致堆栈展开。 ,因为它不涉及堆栈解散, __leave 语句的效率更高。

退出 尝试除外 语句使用 longjmp 运行时函数被视为不正常终止。 阅读本文档 __try 语句,但是,合法跳出一是非法的。 ,如果处理在执行 尝试除外 语句元,将杀害异常未调用处理程序。

示例

以下异常处理程序和终止处理程序的示例。 请参见 尝试最终语句 有关终止处理程序的更多信息。

.
.
.
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                  */

特定于 Microsoft 的结尾

请参见

参考

尝试除语句