首页  >  文章  >  后端开发  >  在 C 语言中什么时候应该使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?

在 C 语言中什么时候应该使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?

DDD
DDD原创
2024-11-07 22:22:03376浏览

When Should You Use `__try` and `__except` Instead of `try` and `catch` in C  ?

C 中的 __try 和 try/catch/finally

C 中,异常处理主要通过 try/catch/finally 块实现。但是,还有一些鲜为人知的命令以双下划线开头,例如 __try。本文旨在阐明何时需要使用这些下划线。

在 Windows 系统上,通过结构化异常处理 (SEH)(一种操作系统级机制)支持异常。编译器通常利用此 SEH 基础结构来实现 C 异常。 throw 和 catch 关键字仅处理 C 异常,其对应的 SEH 异常代码为 0xe06d7363。

为了处理 SEH 异常,C 程序需要使用非标准 __try 关键字。此外,__except 与 catch 类似,但允许指定异常过滤器来确定是否应处理活动异常。 __finally 在异常处理后启用代码执行。

为了说明这些概念,请考虑下面的示例程序:

#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;
}

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;
}

以上是在 C 语言中什么时候应该使用 `__try` 和 `__ except` 而不是 `try` 和 `catch` ?的详细内容。更多信息请关注PHP中文网其他相关文章!

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