首页 > 后端开发 > C++ > 正文

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

Mary-Kate Olsen
发布: 2024-11-06 13:16:02
原创
718 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!