/EH(예외 처리 모델)
업데이트: 2008년 7월
컴파일러에서 사용할 예외 처리 모델을 지정하고, 예외로 인해 범위에서 벗어나게 되는 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하지 않습니다. 또한 Visual C++ 2005에서 비동기 예외가 생성될 때 범위에 있는 모든 개체는 비동기 예외를 처리해도 소멸되지 않습니다. /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와 동일합니다.
자세한 내용은 Exception Handling: Default Synchronous Exception Model을 참조하십시오.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.
C/C++ 폴더를 클릭합니다.
코드 생성 속성 페이지를 클릭합니다.
C++ 예외 처리 가능 속성을 변경합니다.
다음과 같은 절차를 사용할 수도 있습니다.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
C/C++ 폴더를 클릭합니다.
코드 생성 속성 페이지를 클릭합니다.
C++ 예외 처리 가능을 아니요로 설정합니다.
명령줄 속성 페이지를 클릭합니다.
추가 옵션 상자에 컴파일러 옵션을 입력합니다.
프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면
- ExceptionHandling을 참조하십시오.
참고 항목
참조
변경 기록
날짜 |
변경 내용 |
이유 |
---|---|---|
2008년 7월 |
/EHa 옵션에서 저하된 성능의 이미지를 생성하는 방법에 대한 설명이 수정되었습니다. 원치 않는 최적화를 방지하기 위해 샘플의 try 블록에 최종 문이 추가되었습니다. |
향상된 기능 관련 정보 |