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