C 中的异常:__try 与 try/catch/finally
在 C 中,try/catch/finally 结构用于处理例外情况。但是,它们也可能会遇到下划线,例如 __try。这就提出了何时需要这些下划线的问题。
在 Windows 平台上:统一异常处理
在 Windows 上,通过结构化异常在操作系统级别支持异常处理(SEH)。它们与 Unix 信号相当。针对 Windows 的编译器利用 SEH 来实现 C 异常。
非标准 __try 和 __ except
要处理 C 中的 SEH 异常,必须使用非标准 __try 关键字而不是尝试。 __except 关键字与 C 的 catch 类似,但它提供了额外的功能。它允许您指定一个异常过滤表达式来确定是否应捕获活动异常。
__finally 用于异常后代码执行
__finally 关键字允许您处理异常后执行代码。此功能在标准 C 中不存在,但在其他语言中很常见。
禁用析构函数调用的优化
Microsoft 编译器执行可以阻止析构函数的优化在堆栈展开期间在所有情况下都不会被调用。如果它确定在控制对象生命周期的范围内没有抛出,它就会跳过注册代码。为了确保析构函数调用,请使用 /EHa 编译选项来抑制此优化。
演示 SEH 和 C 异常处理的示例
为了说明这些概念,这里有一个代码片段演示了 SEH 异常如何允许 C 析构函数调用以及 C 异常如何构建在 SEH 之上:
#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; } void testProcessorFault() { Example e; int* p = 0; *p = 42; } void testCppException() { Example e; throw 42; } int main() { __try { testProcessorFault(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } __try { testCppException(); } __except(filterException(GetExceptionCode(), GetExceptionInformation())) { std::cout << "caught" << std::endl; } return 0; }
输出:
Filtering c0000005 destructed caught Filtering e06d7363 destructed caught
此示例展示SEH 和 C 异常的处理,演示即使在 SEH 异常期间如何调用析构函数。
以上是在 C 中什么时候应该使用 __try 而不是 try/catch/finally ?的详细内容。更多信息请关注PHP中文网其他相关文章!