Aviso do compilador (nível 4) C4571
Informativo: semântica
catch(...)
mudou desde o Visual C++ 7.1; exceções estruturadas (SEH) não são mais capturadas
C4571 é gerado para cada bloco catch(...)
quando você especifica a opção do compilador /EHs
.
Comentários
Quando você especifica a opção do compilador /EHs
, os blocos catch(...)
não capturam exceções estruturadas. (Exceções de divisão por zero ou de ponteiro nulo, por exemplo.) Um bloco catch(...)
captura apenas exceções C++ lançadas explicitamente. Para saber mais, veja Tratamento de exceção.
Esse aviso está desativado por padrão. Ative esse aviso para garantir que quando você compilar com /EHs
, os blocos catch (...)
não capturem exceções estruturadas. Para obter mais informações, confira Avisos do compilador desativados por padrão.
É possível resolver o erro C4571 de uma maneiras a seguir:
Compile com
/EHa
se você ainda quiser que os blocoscatch(...)
capturem exceções estruturadas.Não habilite C4571 se você não quiser que os blocos
catch(...)
capturem exceções estruturadas, mas ainda quiser usar blocoscatch(...)
. Você ainda pode capturar exceções estruturadas usando as palavras-chave de tratamento de exceções estruturadas (__try
,__except
e__finally
). Mas lembre-se, quando compilados usando/EHs
, os destruidores só serão chamados quando uma exceção C++ for lançada, não quando ocorrer uma exceção SEH.Substitua os blocos
catch(...)
por blocos de captura para exceções específicas de C++ e, opcionalmente, adicione tratamento de exceção estruturada ao redor do tratamento de exceção C++ (__try
,__except
e__finally
). para obter mais informações, consulte Tratamento de Exceção Estruturada (C/C++) e/EH
(Modelo de Tratamento de Exceção).
Exemplo
O exemplo a seguir gera o erro 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
}