C(구조적) 및 C++ 예외 혼합

이식 가능한 코드를 작성하려는 경우 C++ 프로그램에서 SEH(구조적 예외 처리)를 사용하지 않는 것이 좋습니다. 그러나 구조화된 예외와 C++ 소스 코드를 사용하여 /EHa 컴파일하고 혼합하려고 할 수 있으며 두 종류의 예외를 모두 처리하기 위한 몇 가지 기능이 필요할 수 있습니다. 구조적 예외 처리기에는 개체 또는 형식화된 예외의 개념이 없으므로 C++ 코드에서 throw된 예외를 처리할 수 없습니다. 그러나 C++ catch 처리기는 구조적 예외를 처리할 수 있습니다. C++ 예외 처리 구문(try, throw, catch)은 C 컴파일러에서 허용되지 않지만 구조적 예외 처리 구문(__try, __except, __finally)은 C++ 컴파일러에서 지원됩니다.

C++ 예외로 구조적 예외를 처리하는 방법에 대한 자세한 내용은 참조 _set_se_translator 하세요.

구조적 예외와 C++ 예외를 혼합하는 경우 다음과 같은 잠재적인 문제에 유의하세요.

  • C++ 예외 및 구조적 예외는 동일한 함수 내에서 혼합할 수 없습니다.

  • 종료 처리기(__finally 블록)는 예외가 throw된 후 해제하는 동안에도 항상 실행됩니다.

  • C++ 예외 처리는 해제 의미 체계를 사용하도록 설정하는 컴파일러 옵션으로 /EH 컴파일된 모든 모듈에서 해제 의미 체계를 catch하고 유지할 수 있습니다.

  • 소멸자 함수가 모든 개체에 대해 호출되지 않는 경우가 있을 수 있습니다. 예를 들어 초기화되지 않은 함수 포인터를 통해 함수 호출을 시도하는 동안 구조적 예외가 발생할 수 있습니다. 함수 매개 변수가 호출 전에 생성된 개체인 경우 스택 해제 중에 해당 개체의 소멸자가 호출되지 않습니다.

다음 단계

참고 항목

예외 및 오류 처리에 대한 최신 C++ 모범 사례