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++ 프로그램 사용
setjmp
또는longjmp
사용C++ 프로그램의 사용
setjmp
및longjmp
사용에 대한 자세한 내용을 참조하세요.-
C++를 사용하여 구조적 예외를 처리할 수 있는 방법의 예제를 참조하세요.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기