C 中的结构化异常处理 (SEH),使用 __try 和 try/catch/finally
在 C 中,try/catch/finally 块提供一种处理代码块内异常的机制。但是,在 Windows 上,编译器还支持另一种称为结构化异常处理 (SEH) 的方法。
__try 关键字是一个非标准关键字,可让您捕获 SEH 异常。 SEH 异常在操作系统级别受到支持,提供了一种从操作系统本身或从使用 SEH 进行异常处理的代码捕获异常的方法。
__except 关键字允许您指定一个异常过滤表达式,用于确定是否或者不应该捕获活动的异常。这允许您有选择地处理某些类型的异常。
__finally 关键字允许您添加在处理异常后运行的代码。这对于执行清理操作非常有用,例如释放资源或关闭文件。
SEH 异常是在 C 异常之上实现的。 C 异常是使用 throw 关键字引发的,并且可以使用 catch 关键字捕获。当抛出 C 异常时,编译器会创建相应的 SEH 异常,该异常可以被 __try/__except 块捕获。
EHa 编译选项强制编译器始终生成代码来注册所创建对象的析构函数在 try 块的范围内。这确保即使在存在异步 SEH 异常的情况下也会调用析构函数。
为了演示如何在 C 中捕获 SEH 异常,请考虑以下程序:
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; }
当您运行此程序时设置了 EHa 编译选项的程序,输出将显示调用了 Example 对象的析构函数,即使引发 SEH 异常也是如此。这演示了如何在 C 代码中一起处理 SEH 异常和 C 异常。
以上是C 中的结构化异常处理 (SEH) 如何与 __try 和 try/catch/finally 一起工作?的详细内容。更多信息请关注PHP中文网其他相关文章!