/EH(예외 처리 모델)
컴파일러에서 사용할 예외 처리 모델을 지정하고, 예외로 인해 범위에서 벗어나게 되는 C++ 개체를 소멸시킵니다./EH를 지정하지 않으면 컴파일러에서 구조적 예외와 C++ 예외를 catch하지만 예외로 인해 범위에서 벗어나게 되는 C++ 개체를 소멸시키지 않습니다.
/EH{s|a}[c][-]
인수
a
비동기(구조적) 예외 및 동기(C++) 예외를 catch하는 예외 처리 모델입니다.s
C++ 예외만 catch하고 컴파일러가 extern C 함수에서 예외를 throw하는 것으로 가정하도록 하는 예외 처리 모델입니다.c
s (/EHsc)와 함께 사용하면 C++ 예외만 catch되며 컴파일러는 extern C 함수에서 C++ 예외를 throw하지 않는 것으로 가정합니다./EHca는 /EHa와 같습니다.
설명
동기 예외 처리 모델(구조적 예외 처리 예외를 포함하지 않는 C++ 예외 처리)을 지정하려면 /EHs를 사용합니다./EHs를 사용하면 catch 절에서 비동기 예외를 catch하지 않습니다.또한 비동기 예외가 생성될 때 범위에 있는 모든 개체는 비동기 예외를 처리해도 소멸되지 않습니다./EHs를 사용하면 catch(...)는 C++ 예외만 catch합니다.액세스 위반 및 System.Exception 예외는 catch되지 않습니다.
비동기 예외 처리 모델(구조적 예외 처리 예외를 포함하지 않는 C++ 예외 처리)을 지정하려면 /EHa를 사용합니다./EHa를 사용하면 컴파일러에서 throw가 발견되지 않더라도 try 블록을 적극적으로 최적화하지 않으므로 이미지의 성능이 저하될 수 있습니다.
throw가 아닌 방식으로 발생한 예외를 catch하려는 경우에 /EHa를 사용합니다.다음 샘플에서는 예외를 생성합니다.
// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;
void fail() { // generates SE and attempts to catch it using catch(...)
try {
int i = 0, j = 1;
j /= i; // This will throw a SE (divide by zero).
printf("%d", j);
}
catch(...) { // catch block will only be executed under /EHa
cout<<"Caught an exception in catch(...)."<<endl;
}
}
int main() {
__try {
fail();
}
// __except will only catch an exception here
__except(EXCEPTION_EXECUTE_HANDLER) {
// if the exception was not caught by the catch(...) inside fail()
cout << "An exception was caught in __except." << endl;
}
}
/EHc 옵션을 사용하려면 /EHs 또는 /EHa를 지정해야 합니다./clr(공용 언어 런타임 컴파일)을 사용하면 /EHa가 자동으로 적용됩니다. /clr /EHa는 불필요한 중복입니다./clr 뒤에 **/EHs[c]**를 사용하면 컴파일러 오류가 발생합니다.최적화는 이 동작에 영향을 미치지 않습니다.예외가 catch되면 컴파일러는 예외와 같은 범위에 있는 개체에 대한 클래스 소멸자를 호출합니다.예외가 catch되지 않으면 이들 소멸자는 실행되지 않습니다.
/clr을 사용할 때의 예외 처리 제한 사항을 보려면 _set_se_translator를 참조하십시오.
- 기호를 사용하면 옵션을 제거할 수 있습니다.예를 들어 /EHsc-는 /EHs /EHc-로 해석되고 /EHs와 동일합니다.
자세한 내용은 Synchronous Exception Handling를 참조하십시오.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다.자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
C/C++ 폴더를 클릭합니다.
코드 생성 속성 페이지를 클릭합니다.
C++ 예외 처리 가능 속성을 변경합니다.
다음과 같은 절차를 사용할 수도 있습니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
C/C++ 폴더를 클릭합니다.
코드 생성 속성 페이지를 클릭합니다.
C++ 예외 처리 가능을 아니요로 설정합니다.
명령줄 속성 페이지를 클릭합니다.
추가 옵션 상자에 컴파일러 옵션을 입력합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- 자세한 내용은 ExceptionHandling를 참조하십시오.