다음을 통해 공유


/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와 같습니다.

설명

/EHa 컴파일러 옵션은 네이티브 C++ catch(...) 절로 비동기 구조적 예외 처리(SEH)를 지원하는 데 사용됩니다. /EHa를 지정하지 않고 SEH를 구현하려면 __try, __except 및 __finally 구문을 사용할 수 있습니다. 비록 Windows 및 Visual C++가 SEH를 지원하지만 이식 가능하고 유연한 코드를 만들기 위해 ISO 표준 C++ 예외 처리(/EHs 또는 /EHsc)를 사용하는 것이 좋습니다. 그러나 기존 코드 또는 특정 종류의 프로그램, 예를 들어 공통 언어 런타임(/clr(공용 언어 런타임 컴파일))을 지원하기 위해 컴파일된 코드에서는 SEH를 계속 사용할 수 있습니다. 자세한 내용은 구조적 예외 처리 (C/C++)을 참조하십시오.

/EHa를 지정하고 catch(...)를 사용하여 모든 예외를 처리하려고 하면 위험할 수 있습니다. 대부분의 경우 비동기 예외는 복구할 수 없고 치명적인 것으로 간주해야 합니다. Catch하고 진행하면 프로세스가 손상되고 찾아 수정할 수 없는 버그를 일으킬 수 있습니다.

/EHs 또는 /EHsc를 사용하는 경우 catch(...) 절은 비동기 구조적 예외를 catch하지 않습니다. 액세스 위반 및 관리되는 Exception 예외가 catch되지 않고 비동기 예외가 발생할 때 비동기 예외가 처리되더라도 범위의 개체가 소멸되지 않습니다.

/EHa를 사용하는 경우 컴파일러가 try 블록을 적극적으로 최적화하지 않으므로 이미지가 커지고 성능이 저하될 수 있고 컴파일러가 C++ 예외를 throw할 수 있는 모든 코드가 표시되지 않아도 모든 로컬 개체의 소멸자를 자동으로 호출하는 필터를 예외에 유지합니다. 이렇게 하면 안전 스택이 C++ 예외 뿐만 아니라 비동기 예외에 대해 해제됩니다. /EHs를 사용하는 경우 컴파일러는 예외가 throw 문 또는 함수 호출에서만 발생할 수 있다고 가정합니다. 이렇게 하면 컴파일러가 해제할 수 있는 여러 개체의 수명을 추적하기 위한 코드를 제거할 수 있고 이에 따라 코드 크기가 상당히 줄어들 수 있습니다.

/EHa를 사용하여 컴파일된 개체를 같은 실행 모듈의 /EHs를 사용하여 컴파일된 개체와 함께 연결하지 않는 것이 좋습니다. /EHa를 사용하여 모듈의 아무 곳에서나 비동기 예외를 처리해야 할 경우 /EHa를 사용하여 모듈의 모든 코드를 컴파일합니다. /EHs를 사용하여 컴파일된 코드와 같은 모듈의 구조적 예외 처리 구문을 사용할 수 있지만 SEH 구문을 같은 함수의 try, throw 및 catch에 혼합할 수 없습니다.

throw가 아닌 방식으로 발생한 예외를 catch하려는 경우에 /EHa를 사용합니다. 이 예제는 구조적 예외를 생성 및 catch합니다.

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

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

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

  2. 왼쪽 창에서 구성 속성, C/C++, 코드 생성을 확장합니다.

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

    또는 C++ 예외 처리 가능아니요로 설정하고, 명령줄 속성 페이지에서, 추가 옵션 상자에 컴파일러 옵션을 추가합니다.

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

참고 항목

참조

컴파일러 옵션

컴파일러 옵션 설정

예외 사양

구조적 예외 처리 (C/C++)

개념

오류 및 예외 처리(최신 C++)