정보:
catch(...)Visual C++ 7.1 이후 의미 체계가 변경되었습니다. SEH(구조적 예외)가 더 이상 catch되지 않음
설명
C4571은 컴파일러 옵션을 지정할 때 모든 catch(...) 블록에 대해 /EHs 생성됩니다.
컴파일러 옵션을 /EHs 지정 catch(...) 하면 블록이 구조적 예외를 catch하지 않습니다. (예를 들어 0으로 나누거나 null 포인터 예외로 나눕니다.) 블록은 catch(...) 명시적으로 throw된 C++ 예외만 catch합니다. 자세한 내용은 예외 처리를 참조하세요.
기본적으로 이 경고는 해제되어 있습니다. 블록을 사용하여 컴파일 /EHscatch (...) 할 때 구조적 예외를 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
}