Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 4) C4571

Informacyjna: semantyki catch(...) zmienione od Visual C++ 7.1; nie jest już złapane Structured wyjątki (strukturalnej)

C4571 jest generowany dla każdego bloku catch(...) podczas kompilacji z /EHs.

Podczas kompilowania z /EHs, blok catch(...) nie będzie przechwytywać structured exception (dzielenie przez zero, wskaźnik zerowy, na przykład); catch(...) blok będzie tylko połów jawnie wyrzucony, C++ wyjątki. Aby uzyskać dodatkowe informacje, zobacz Obsługa wyjątków w języku Visual C++.

To ostrzeżenie jest domyślnie wyłączona. Włączenie tego ostrzeżenia w celu zapewnienia, że podczas kompilacji z /EHs nie zamierzają przechwytywać wyjątków structured Twój blok catch (...). Aby uzyskać więcej informacji, zobacz Domyślnie wyłączone ostrzeżenia kompilatora.

C4571 można rozwiązać na jeden z następujących sposobów,

  • Kompiluj z /EHa Jeśli nadal chcesz bloków catch(...) aby przechwytywać wyjątków strukturalnych.

  • Nie należy włączać C4571, jeśli nie chcesz, aby Twoje bloki catch(...), aby przechwytywać wyjątków structured, ale nadal chcesz użyć bloków catch(...). Można jeszcze złapać structured wyjątków przy użyciu słów kluczowych obsługi wyjątków strukturalne (__try, __except, i __finally). Należy jednak pamiętać, gdy kompilowany /EHs destruktorów tylko zostanie wywołana, gdy C++ powoduje wyjątek, nie wystąpi wyjątek strukturalnej obsługi wyjątków.

  • Zastąpić blok catch(...) bloki catch dla określonych wyjątków C++ i opcjonalnie dodać obsługi wokół obsługi wyjątków C++ wyjątków strukturalne (__try, __except, i __finally). Aby uzyskać więcej informacji, zobacz Obsługa wyjątków strukturalnych (C/C++).

Aby uzyskać więcej informacji, zobacz /EH (Model obsługi wyjątku).

Przykład

Poniższy przykład generuje 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
}