Condividi tramite


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
}