> 백엔드 개발 > C++ > C에서 try/catch/finally 대신 __try를 언제 사용해야 합니까?

C에서 try/catch/finally 대신 __try를 언제 사용해야 합니까?

DDD
풀어 주다: 2024-11-11 13:58:02
원래의
529명이 탐색했습니다.

When Should You Use __try Instead of try/catch/finally in C  ?

C의 예외: __try 대 try/catch/finally

C에서는 try/catch/finally 구문을 사용하여 처리합니다. 예외. 그러나 __try와 같은 밑줄을 사용할 수도 있습니다. 이는 밑줄이 언제 필요한지에 대한 의문을 제기합니다.

Windows 플랫폼: 통합 예외 처리

Windows에서는 구조적 예외를 통해 운영 체제 수준에서 예외가 지원됩니다. 취급(SEH). 이는 Unix 신호와 유사합니다. Windows를 대상으로 하는 컴파일러는 SEH를 활용하여 C 예외를 구현합니다.

비표준 __try 및 __Exception

C에서 SEH 예외를 처리하려면 비표준 __try 키워드를 사용해야 합니다. 시도하는 대신. __out 키워드는 C의 catch와 유사하지만 추가 기능을 제공합니다. 활성 예외를 포착해야 하는지 여부를 결정하는 예외 필터 표현식을 지정할 수 있습니다.

__finally(예외 후 코드 실행의 경우)

__finally 키워드를 사용하면 다음을 수행할 수 있습니다. 예외가 처리된 후 코드를 실행합니다. 이 기능은 표준 C에는 없지만 다른 언어에서는 일반적입니다.

소멸자 호출에 대한 최적화 비활성화

Microsoft 컴파일러는 소멸자를 방지할 수 있는 최적화를 수행합니다. 스택 해제 중에 모든 경우에 호출되지 않습니다. 개체의 수명을 제어하는 ​​범위 내에 throw가 없다고 판단되면 등록 코드를 건너뜁니다. 소멸자 호출을 보장하려면 /EHa 컴파일 옵션을 사용하여 이 최적화를 억제하세요.

SEH 및 C 예외 처리 시연 예시

개념을 설명하기 위한 코드 조각은 다음과 같습니다. 이는 SEH 예외가 C 소멸자 호출을 허용하는 방법과 C 예외가 SEH 위에 구축되는 방법을 보여줍니다. 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/catch/finally 대신 __try를 언제 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿