Compiler Warning (level 4) C4571
Informational:
catch(...)
semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught
C4571 is generated for every catch(...)
block when you specify the /EHs
compiler option.
When you specify the /EHs
compiler option, catch(...)
blocks don't catch structured exceptions. (Divide by zero, or null pointer exceptions, for example.) A catch(...)
block only catches explicitly thrown C++ exceptions. For more information, see Exception Handling.
This warning is off by default. Turn this warning on to ensure that when you compile with /EHs
your catch (...)
blocks don't catch structured exceptions. For more information, see Compiler warnings that are off by default.
You can resolve C4571 in one of the following ways:
Compile with
/EHa
if you still want yourcatch(...)
blocks to catch structured exceptions.Don't enable C4571 if you don't want your
catch(...)
blocks to catch structured exceptions, but you still want to usecatch(...)
blocks. You can still catch structured exceptions using the structured exception handling keywords (__try
,__except
, and__finally
). But remember, when compiled using/EHs
, destructors are only called when a C++ exception is thrown, not when an SEH exception occurs.Replace
catch(...)
blocks with catch blocks for specific C++ exceptions, and optionally, add structured exception handling around the C++ exception handling (__try
,__except
, and__finally
). for more information, see Structured Exception Handling (C/C++) and/EH
(Exception Handling Model).
The following sample generates 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
}