Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Informacyjne:
catch(...)semantyka zmieniła się od czasu, gdy program Visual C++ 7.1; wyjątki ustrukturyzowane (SEH) nie są już przechwytywane
Uwagi
C4571 jest generowany dla każdego catch(...) bloku podczas określania opcji kompilatora /EHs .
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ą
/EHapolecenia , 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 kod 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
}