다음을 통해 공유


컴파일러 경고(수준 4) C4571

정보: catch(...) Visual C++ 7.1 이후 의미 체계가 변경되었습니다. SEH(구조적 예외)가 더 이상 catch되지 않음

C4571은 컴파일러 옵션을 지정할 때 모든 catch(...) 블록에 대해 /EHs 생성됩니다.

설명

컴파일러 옵션을 catch(...) 지정 /EHs 하면 블록이 구조적 예외를 catch하지 않습니다. (예를 들어 0으로 나누거나 null 포인터 예외로 나눕니다.) 블록은 catch(...) 명시적으로 throw된 C++ 예외만 catch합니다. 자세한 내용은 예외 처리를 참조하세요.

기본적으로 이 경고는 해제되어 있습니다. 블록을 사용하여 컴파일 /EHs catch (...) 할 때 구조적 예외를 catch하지 않도록 하려면 이 경고를 켭니다. 자세한 내용은 기본적으로 꺼져 있는 컴파일러 경고를 참조하세요.

다음 방법 중 하나로 C4571을 해결할 수 있습니다.

  • 블록이 /EHa 구조화된 예외를 catch하도록 하려면 catch(...) 컴파일합니다.

  • 블록에서 구조적 예외를 catch하지 않으려 catch(...) 면 C4571을 사용하도록 설정하지 마세요. 그러나 여전히 블록을 사용 catch(...) 하려고 합니다. 구조적 예외 처리 키워드(__try__except__finally)를 사용하여 구조화된 예외를 계속 catch할 수 있습니다. 그러나 SEH /EHs예외가 발생할 때가 아니라 C++ 예외가 throw될 때만 소멸자가 호출됩니다.

  • 블록을 특정 C++ 예외에 대한 catch 블록으로 바꾸고catch(...), 필요에 따라 C++ 예외 처리(__try__except__finally)를 중심으로 구조적 예외 처리를 추가합니다. 자세한 내용은 구조적 예외 처리(C/C++)/EH (예외 처리 모델)을 참조하세요.

예시

다음 샘플에서는 C4571을 생성합니다.

// C4571.cpp
// compile with: /EHs /W4 /c
#pragma warning(default : 4571)
int main() {
   try {
      int i = 0, j = 1;
      j /= i;   // this will throw a SE (divide by zero)
   }
   catch(...) {}   // C4571 warning
}