Condividi tramite


Avviso del compilatore (livello 4) C4571

Informativo: catch(...) la semantica è cambiata dopo Visual C++ 7.1; le eccezioni strutturate (edizione Standard H) 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 i catch(...) blocchi intercettano le eccezioni strutturate.

  • Non abilitare C4571 se non si vuole che i catch(...) blocchi intercettano le eccezioni strutturate, ma si vogliono comunque usare catch(...) blocchi. È comunque possibile intercettare eccezioni strutturate usando le parole chiave di gestione delle eccezioni strutturate (__try, __excepte __finally). Tenere presente, tuttavia, quando viene compilato usando /EHs, i distruttori vengono chiamati solo quando viene generata un'eccezione C++, non quando si verifica un'eccezione edizione Standard H.

  • 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, __excepte __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
}