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


Предупреждение компилятора (уровень 4) C4571

Информационные: catch(...) семантика изменилась, так как Visual C++ 7.1; структурированные исключения (SEH) больше не перехватываются

C4571 создается для каждого catch(...) блока при указании параметра компилятора /EHs .

Замечания

При указании параметра catch(...) компилятора /EHs блоки не перехватывает структурированные исключения. (Например, деление на ноль или исключение указателя NULL. Блок catch(...) перехватывает только явные исключения C++. Дополнительные сведения см. в разделе Обработка исключений.

Это предупреждение отключено по умолчанию. Включите это предупреждение, чтобы гарантировать, что при компиляции с /EHs catch (...) блоками не перехватывает структурированные исключения. Дополнительные сведения см. в разделе "Предупреждения компилятора", отключенные по умолчанию.

Вы можете разрешить C4571 одним из следующих способов:

  • /EHa Скомпилируйте, если блоки по-прежнему хотят catch(...) перехватывать структурированные исключения.

  • Не включите C4571, если вы не хотите catch(...) , чтобы блоки перехватили структурированные исключения, но вы по-прежнему хотите использовать catch(...) блоки. Вы по-прежнему можете перехватывать структурированные исключения с помощью ключевых слов обработки структурированных исключений (__try, __exceptи __finally). Но помните, что при компиляции /EHsдеструкторы вызываются только при возникновении исключения C++, а не при возникновении исключения SEH.

  • Замените catch(...) блоки catch для определенных исключений C++ и при необходимости добавьте структурированную обработку исключений вокруг обработки исключений C++ (__tryи__finally__except). Дополнительные сведения см. в разделе "Структурированная обработка исключений" (C/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
}