Share via


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 /EHscatch (...) 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žívat catch(...) bloky. Strukturované výjimky můžete stále zachytit pomocí klíčových slov (, __excepta__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, __excepta __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
}