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 blocos catch(...) 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 blocos catch(...). 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
}