Поделиться через


Предупреждение компилятора (уровень 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
}