Udostępnij za pośrednictwem


C4571 (poziom 4) ostrzeżenia kompilatora

Informacyjna: semantyki catch(...) w porównaniu z Visual C++ 7.1; wyjątki strukturalne (SEH) nie jest już zostały złowione

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 thrown, wyjątki C++.Aby uzyskać więcej informacji, zobacz Obsługa wyjątków w programie Visual C++.

To ostrzeżenie jest domyślnie wyłączona.Włącz to ostrzeżenie, aby zapewnić, że podczas kompilacji z /EHs nie jest planowane połowu wyjątki strukturalne na bloki catch (...).Zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone Aby uzyskać więcej informacji.

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

  • Kompiluj z /EHa , jeśli nadal chcesz swoje bloki catch(...), aby przechwytywać wyjątków strukturalnych.

  • Nie włączaj C4571, jeśli nie chcesz, aby Twoje bloki catch(...), aby przechwytywać wyjątków strukturalnych, ale nadal chcesz użyć bloków catch(...).Nadal można wychwycić wyjątki strukturalne, używając strukturalnej obsługi słowa kluczowe wyjątków (__try, __except, i __finally).Pamiętaj jednak, gdy kompilowany /EHs destruktory tylko zostanie wywołana, gdy wyrzucany jest wyjątek C++, nie w przypadku, gdy wystąpi wyjątek SEH.

  • Zastąp blok catch(...) bloki catch, szczególne wyjątki C++ i opcjonalnie Dodaj strukturalnej obsługi wokół obsługę wyjątków C++ wyjątków (__try, __except, i __finally).Zobacz Strukturalnej obsługi (C++) wyjątków Aby uzyskać więcej informacji.

Zobacz /Eh (Model obsługi wyjątków) Aby uzyskać więcej informacji.

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
}