/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와 동일합니다.

자세한 내용은 Exception Handling: Default Synchronous Exception Model를 참조하십시오.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 방법: 프로젝트 속성 페이지 열기를 참조하십시오.

  2. C/C++ 폴더를 클릭합니다.

  3. 코드 생성 속성 페이지를 클릭합니다.

  4. C++ 예외 처리 가능 속성을 변경합니다.

다음과 같은 절차를 사용할 수도 있습니다.

Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면

  1. C/C++ 폴더를 클릭합니다.

  2. 코드 생성 속성 페이지를 클릭합니다.

  3. C++ 예외 처리 가능아니요로 설정합니다.

  4. 명령줄 속성 페이지를 클릭합니다.

  5. 추가 옵션 상자에 컴파일러 옵션을 입력합니다.

프로그래밍 방식으로 이 컴파일러 옵션을 설정하려면

참고 항목

참조

컴파일러 옵션

컴파일러 옵션 설정

Exception Specifications