>백엔드 개발 >C++ >C에서 `try`와 `catch` 대신 `__try`와 `__Exception`을 사용해야 하는 경우는 언제입니까?

C에서 `try`와 `catch` 대신 `__try`와 `__Exception`을 사용해야 하는 경우는 언제입니까?

DDD
DDD원래의
2024-11-07 22:22:03442검색

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

__C에서 try/catch/finally

C에서 예외 처리는 주로 try/catch/finally 블록을 통해 수행됩니다. 그러나 __try와 같이 이중 밑줄로 시작하는 덜 알려진 명령이 있습니다. 이 문서에서는 밑줄이 필요한 시기를 명확히 설명하는 것을 목표로 합니다.

Windows 시스템에서는 운영 체제 수준 메커니즘인 SEH(구조적 예외 처리)를 통해 예외가 지원됩니다. 컴파일러는 일반적으로 C 예외 구현을 위해 이 SEH 인프라를 활용합니다. throw 및 catch 키워드는 C 예외만 처리하며 해당 SEH 예외 코드는 0xe06d7363입니다.

SEH 예외를 처리하려면 C 프로그램에서 비표준 __try 키워드를 사용해야 합니다. 또한 __Exception은 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`와 `catch` 대신 `__try`와 `__Exception`을 사용해야 하는 경우는 언제입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.