Avviso del compilatore (livello 4) C4571
Informativo:
catch(...)
semantica modificata dopo Visual C++ 7.1; le eccezioni strutturate (SEH) non vengono più rilevate
L'opzione C4571 viene generata per ogni catch(...)
blocco quando si specifica l'opzione del /EHs
compilatore.
Osservazioni:
Quando si specifica l'opzione del /EHs
compilatore, catch(...)
i blocchi non intercettano le eccezioni strutturate. (Dividere per zero o eccezioni puntatore Null, ad esempio. Un catch(...)
blocco rileva solo eccezioni C++ generate in modo esplicito. Per altre informazioni, vedere Gestione delle eccezioni.
Per impostazione predefinita, questo avviso non è attivo. Attivare questo avviso per assicurarsi che quando si esegue la compilazione con /EHs
i catch (...)
blocchi non intercetta le eccezioni strutturate. Per altre informazioni, vedere Avvisi del compilatore disattivati per impostazione predefinita.
È possibile risolvere C4571 in uno dei modi seguenti:
Eseguire la compilazione con
/EHa
se si desidera che icatch(...)
blocchi intercettano le eccezioni strutturate.Non abilitare C4571 se non si vuole che i
catch(...)
blocchi intercettano le eccezioni strutturate, ma si vogliono comunque usarecatch(...)
blocchi. È comunque possibile intercettare eccezioni strutturate usando le parole chiave di gestione delle eccezioni strutturate (__try
,__except
e__finally
). Tenere tuttavia presente che, quando viene compilato usando/EHs
, i distruttori vengono chiamati solo quando viene generata un'eccezione C++, non quando si verifica un'eccezione SEH.Sostituire
catch(...)
i blocchi con blocchi catch per eccezioni C++ specifiche e, facoltativamente, aggiungere la gestione strutturata delle eccezioni per la gestione delle eccezioni C++ (__try
,__except
e__finally
). Per altre informazioni, vedere Structured Exception Handling (C/C++) e/EH
(Modello di gestione delle eccezioni).
Esempio
L'esempio seguente genera 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
}