首页  >  文章  >  后端开发  >  何时以及为何应在 C 中使用 __try 关键字?

何时以及为何应在 C 中使用 __try 关键字?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-06 13:16:02718浏览

When and Why Should You Utilize the __try Keyword in C  ?

C Try/Catch/Finally 块和 __try 关键字

结构化异常处理 (SEH) 是操作系统级别的异常处理机制Windows 支持。 Windows 编译器通常利用 SEH 来实现 C 异常。

虽然 C 关键字 throw 和 catch 专门处理 C 异常,但 Microsoft Visual C (MSVC) 编译器提供非标准 __try 和 __ except 关键字来处理 SEH 异常。

__try 块:

非标准 __try 块定义了可能发生异常的范围,就像 C 中的 try 块一样。接下来是 __except 和 __finally 块。

__ except 块:

__ except 块类似于 C 中的 catch 块,但提供了更大的灵活性。它有一个异常过滤表达式,用于评估是否应处理活动异常。

__finally 块:

__finally 块包含在任何异常处理后运行的代码。它类似于 C# 中的 finally 块,但在标准 C 中并不直接等效。

__try 块的用例:

SEH 异常可以包括由操作生成的异常系统、使用 SEH 的互操作代码或使用“.NET”异常代码的托管代码。要在 C 中捕获这些异常,必须将 __try 块与 __except 块一起使用。

示例程序:

示例程序演示了 SEH 异常以及如何使用 C 析构函数在 SEH 异常展开期间调用。

#include <windows.h>
#include <iostream>

class Example {
public:
  ~Example() { std::cout << "destructed" << std::endl; }
};

int filterException(int code, PEXCEPTION_POINTERS ex) {
  std::cout << "Filtering " << std::hex << code << std::endl;
  return EXCEPTION_EXECUTE_HANDLER;
}

int main() {
  __try {
    Example e;
    int* p = 0;
    *p = 42;  // intentially generating a processor fault
  } __except (filterException(GetExceptionCode(), GetExceptionInformation())) {
    std::cout << "caught" << std::endl;
  }

  return 0;
}

输出:

Filtering c0000005
destructed
caught

以上是何时以及为何应在 C 中使用 __try 关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn