>  기사  >  백엔드 개발  >  SEH(구조적 예외 처리)는 __try 및 try/catch/finally를 사용하여 C에서 어떻게 작동합니까?

SEH(구조적 예외 처리)는 __try 및 try/catch/finally를 사용하여 C에서 어떻게 작동합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-07 13:11:03319검색

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

__try 및 try/catch/finally를 사용하는 C의 SEH(구조적 예외 처리)

C에서 try/catch/finally가 차단됩니다. 코드 블록 내에서 예외를 처리하기 위한 메커니즘을 제공합니다. 그러나 Windows에서 컴파일러는 SEH(구조적 예외 처리)라는 다른 접근 방식도 지원합니다.

__try 키워드는 SEH 예외를 포착할 수 있는 비표준 키워드입니다. SEH 예외는 운영 체제 수준에서 지원되며 운영 체제 자체 또는 예외 처리를 위해 SEH를 사용하는 코드에서 예외를 포착하는 방법을 제공합니다.

__Exception 키워드를 사용하면 다음 여부를 결정하는 예외 필터 표현식을 지정할 수 있습니다. 또는 활성 예외가 포착되지 않아야 합니다. 이를 통해 특정 유형의 예외를 선택적으로 처리할 수 있습니다.

__finally 키워드를 사용하면 예외가 처리된 후에 실행되는 코드를 추가할 수 있습니다. 이는 리소스 해제 또는 파일 닫기와 같은 정리 작업을 수행하는 데 유용할 수 있습니다.

SEH 예외는 C 예외 위에 구현됩니다. C 예외는 throw 키워드를 사용하여 발생하며 catch 키워드를 사용하여 포착할 수 있습니다. C 예외가 발생하면 컴파일러는 __try/__Exception 블록에서 포착할 수 있는 해당 SEH 예외를 생성합니다.

EHa 컴파일 옵션은 컴파일러가 항상 생성된 객체의 소멸자를 등록하는 코드를 생성하도록 합니다. try 블록의 범위에 있습니다. 이렇게 하면 비동기 SEH 예외가 있는 경우에도 소멸자가 호출됩니다.

SEH 예외가 C에서 어떻게 포착될 수 있는지 보여주기 위해 다음 프로그램을 고려하세요.

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 컴파일 옵션이 설정된 프로그램을 실행하면 SEH 예외가 발생하더라도 예제 개체의 소멸자가 호출되는 것으로 출력에 표시됩니다. 이는 C 코드에서 SEH 예외와 C 예외를 함께 처리할 수 있는 방법을 보여줍니다.

위 내용은 SEH(구조적 예외 처리)는 __try 및 try/catch/finally를 사용하여 C에서 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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