Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 4) C4571

Informacyjne: catch(...) semantyka zmieniła się od czasu, gdy program Visual C++ 7.1; wyjątki ustrukturyzowane (SEH) nie są już przechwytywane

C4571 jest generowany dla każdego catch(...) bloku podczas określania opcji kompilatora /EHs .

Uwagi

Po określeniu /EHs opcji catch(...) kompilatora bloki nie przechwytują wyjątków strukturalnych. (Podziel według wyjątków od zera lub wskaźnika null, na przykład). Blok catch(...) przechwytuje tylko jawnie zgłoszone wyjątki języka C++. Aby uzyskać więcej informacji, zobacz Obsługa wyjątków.

To ostrzeżenie jest domyślnie wyłączone. Włącz to ostrzeżenie, aby upewnić się, że podczas kompilowania z blokami /EHscatch (...) nie przechwytują wyjątków strukturalnych. Aby uzyskać więcej informacji, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone.

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

  • Skompiluj za pomocą /EHa polecenia , jeśli bloki nadal mają catch(...) przechwytywać wyjątki ustrukturyzowane.

  • Nie włączaj C4571, jeśli nie chcesz catch(...) , aby bloki przechwytywać wyjątki strukturalne, ale nadal chcesz używać catch(...) bloków. Nadal można przechwytywać wyjątki ustrukturyzowane przy użyciu słów kluczowych obsługi wyjątków strukturalnych (__try, __except, i __finally). Pamiętaj jednak, że podczas kompilowania przy użyciu /EHsfunkcji , destruktory są wywoływane tylko wtedy, gdy zgłaszany jest wyjątek C++, a nie w przypadku wystąpienia wyjątku SEH.

  • Zastąp catch(...) bloki blokami catch dla określonych wyjątków języka C++, a opcjonalnie dodaj obsługę wyjątków strukturalnych wokół obsługi wyjątków języka C++ (__try, __except, i __finally). Aby uzyskać więcej informacji, zobacz Obsługa wyjątków strukturalnych (C/C++) i /EH (Model obsługi wyjątków).

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
}