Предупреждение компилятора (уровень 4) C4571
К сведению: семантика catch(...) изменилась, начиная с версии Visual C++ 7.1; структурированные исключения (SEH) более не перехватываются
Предупреждение C4571 создается для каждого блока catch(...) при компиляции с параметром /EHs.
При компиляции с параметром /EHs блок catch(...) не будет перехватывать структурированные исключения (например, деление на ноль или нулевой указатель). Блок catch(...) будет перехватывать только исключения C++, создаваемые явным образом. Дополнительные сведения см. в разделе Exception Handling in Visual C++.
Это предупреждение по умолчанию отключено. Включите это предупреждение для обеспечения того, что при компиляции с параметром /EHs блоки catch (...) не будут перехватывать структурированные исключения. Дополнительные сведения см. в разделе Compiler Warnings That Are Off by Default.
Предупреждение C4571 можно устранить одним из следующих способов:
Выполняйте компиляцию с параметром /EHa, если блоки catch(...) должны по-прежнему перехватывать структурированные исключения.
Не включайте предупреждение C4571, если блоки catch(...) не должны перехватывать структурированные исключения, но при этом использование блоков catch(...) необходимо. Структурированные исключения можно также перехватывать с помощью ключевых слов обработки структурированных исключений (__try, __except и __finally). При этом, однако, следует помнить, что при компиляции с параметром /EHs деструкторы будут вызываться только при создании исключения C++, но не при возникновении исключения SEH.
Замените блок catch(...) блоками catch для конкретных исключений C++. Также при этом можно добавить обработку структурированных исключений вокруг обработки исключений C++ (__try, __except и __finally). Дополнительные сведения см. в разделе Structured Exception Handling (C++).
Дополнительные сведения см. в разделе Параметр /EH (модель обработки исключений).
Пример
Следующий пример приводит к возникновению предупреждения 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
}