首页  >  文章  >  后端开发  >  C 中的结构化异常处理 (SEH) 如何与 __try 和 try/catch/finally 一起工作?

C 中的结构化异常处理 (SEH) 如何与 __try 和 try/catch/finally 一起工作?

Barbara Streisand
Barbara Streisand原创
2024-11-07 13:11:03322浏览

How Does Structured Exception Handling (SEH) Work in C   with __try and try/catch/finally?

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

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