Upozornění kompilátoru (úroveň 4) C4571
Informační:
catch(...)
sémantika se změnila od verze Visual C++ 7.1; strukturované výjimky (SEH) se už nezachytí.
C4571 se generuje pro každý catch(...)
blok při zadání možnosti kompilátoru /EHs
.
Poznámky
Když zadáte možnost kompilátoru /EHs
, catch(...)
bloky nezachytí strukturované výjimky. (Například vydělte nulou nebo výjimkou ukazatele null.) catch(...)
Blok zachytává pouze explicitně vyvolané výjimky jazyka C++. Další informace naleznete v tématu Zpracování výjimek.
Toto upozornění je ve výchozím nastavení vypnuté. Zapněte toto upozornění, abyste zajistili, že při kompilaci s /EHs
catch (...)
bloky nezachytí strukturované výjimky. Další informace najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá.
C4571 můžete vyřešit jedním z následujících způsobů:
Zkompilujte je,
/EHa
pokud chcete,catch(...)
aby bloky zachytily strukturované výjimky.Nepovolujte C4571, pokud nechcete
catch(...)
, aby bloky zachytily strukturované výjimky, ale přesto chcete používatcatch(...)
bloky. Strukturované výjimky můžete stále zachytit pomocí klíčových slov (,__except
a__finally
) strukturovaného zpracování výjimek .__try
Nezapomeňte však, že při kompilaci pomocí/EHs
, destruktory jsou volána pouze v případě, že je vyvolána výjimka jazyka C++, ne když dojde k výjimce SEH.Nahraďte
catch(...)
bloky bloky catch pro konkrétní výjimky jazyka C++ a volitelně přidejte strukturované zpracování výjimek kolem zpracování výjimek jazyka C++ (__try
,__except
a__finally
). Další informace naleznete v tématu Strukturované zpracování výjimek (C/C++) a/EH
(model zpracování výjimek).
Příklad
Následující ukázka vygeneruje 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
}