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
}