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 /EHs
catch (...)
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/EHs
funkcji , 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
}