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