Compilerwarnung (Stufe 4) C4571

Aktualisiert: November 2007

Fehlermeldung

Information: Die catch(...)-Semantik hat sich seit Visual C++ 7.1 geändert; strukturierte Ausnahmen (SEH) werden nicht mehr abgefangen
Informational: catch(...) semantics changed since Visual C++ 7.1; structured exceptions (SEH) are no longer caught

C4571 wird bei Kompilierung mit /EHs für jeden catch(...)-Block generiert.

Beim Kompilieren mit /EHs wird eine strukturierte Ausnahme (z. B. Division durch 0 (null), Nullzeiger) nicht von einem catch(...)-Block aufgefangen; catch(...)-Blöcke fangen nur explizit ausgelöste C++-Ausnahmen auf. Weitere Informationen finden Sie unter Exception Handling in Visual C++.

Diese Warnung ist standardmäßig deaktiviert. Aktivieren Sie diese Warnung, um sicherzustellen, dass beim Kompilieren mit /EHs die catch(...)-Blöcke nicht zum Abfangen strukturierter Ausnahmen verwendet werden. Weitere Informationen finden Sie unter Compiler Warnings That Are Off by Default.

Zum Beheben des Fehlers C4571 bestehen folgende Möglichkeiten:

  • Kompilieren Sie mit /EHa, wenn catch(...)-Blöcke weiterhin strukturierte Ausnahmen abfangen sollen.

  • Aktivieren Sie C4571 nicht, wenn die catch(...)-Blöcke keine strukturierten Ausnahmen abfangen sollen, Sie jedoch catch(...)-Blöcke verwenden möchten. Sie können strukturierte Ausnahmen auch weiterhin abfangen, indem Sie die Schlüsselwörter für strukturierte Ausnahmebehandlung verwenden (__try, __except und __finally). Beachten Sie jedoch, dass kompilierte /EHs-Destruktoren nur bei Auslösung von C++-Ausnahmen aufgerufen werden, nicht bei SEH-Ausnahmen.

  • Ersetzen Sie catch(...)-Blöcke mit catch-Blöcken für bestimmte C++-Ausnahmen, und fügen Sie der C++-Ausnahmebehandlung wahlweise eine strukturierte Ausnahmebehandlung hinzu (__try, __except und __finally). Weitere Informationen finden Sie unter Structured Exception Handling (C++).

Weitere Informationen finden Sie unter /EH (Ausnahmebehandlungsmodell).

Beispiel

Im folgenden Beispiel wird C4571 generiert.

// 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
}