Avviso del compilatore (livello 4) C4571
Messaggio informativo: la semantica di catch(...) è cambiata dopo Visual C++ 7.1; le eccezioni strutturate (SEH) non vengono più rilevate
L'avviso C4571 viene visualizzato per ogni blocco catch(...) quando si esegue la compilazione con /EHs.
Quando si esegue la compilazione con /EHs, un blocco catch(...) non rileverà un'eccezione strutturata, causata ad esempio da una divisione per zero o un puntatore null, ma rileverà solo le eccezioni C++ generate in modo esplicito. Per ulteriori informazioni, vedere Exception Handling in Visual C++.
Per impostazione predefinita, questo avviso non è attivo. Attivare la visualizzazione dell'avviso per assicurarsi che durante la compilazione con /EHs i blocchi catch(...) non rilevino le eccezioni strutturate. Per ulteriori informazioni, vedere Compiler Warnings That Are Off by Default.
È possibile evitare la visualizzazione dell'avviso C4571 in uno dei seguenti modi:
Eseguire la compilazione con /EHa se si desidera che i blocchi catch(...) continuino a rilevare le eccezioni strutturate.
Non attivare la visualizzazione dell'avviso C4571 se si desidera continuare a utilizzare i blocchi catch(...) senza che rilevino le eccezioni strutturate. Queste ultime possono comunque essere intercettate utilizzando le parole chiave di gestione delle eccezioni __try, __except e __finally. È tuttavia opportuno tenere presente che i distruttori compilati con /EHs verranno chiamati solo quando viene generata un'eccezione C++ e non quando si verifica un'eccezione SEH.
Sostituire il blocco catch(...) con blocchi catch per eccezioni C++ specifiche ed eventualmente aggiungere la gestione delle eccezioni strutturate alla gestione delle eccezioni C++ (__try, __except e __finally). Per ulteriori informazioni, vedere Structured Exception Handling (C++).
Per ulteriori informazioni, vedere /EH (Modello di gestione delle eccezioni).
Esempio
Nell'esempio seguente viene generato l'errore 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
}