Compartir a través de


Advertencia del compilador (nivel 4) C4571

Información: la semántica de catch(...) cambió desde Visual C++ 7.1; ya no se detectan excepciones estructuradas (SEH)

C4571 se genera para cada bloque catch(...) al especificar la opción del compilador /EHs.

Comentarios

Al especificar la opción del compilador /EHs, los bloques catch(...) no detectan excepciones estructuradas. (Divide por cero o excepciones de puntero nulo, por ejemplo). Un bloque catch(...) solo detecta excepciones de C++ iniciadas explícitamente. Para más información, consulte Control de excepciones.

De forma predeterminada, esta advertencia está desactivada. Active esta advertencia para asegurarse de que, al compilar con los bloques /EHs y catch (...), no se detecten excepciones estructuradas. Para más información, consulte Advertencias del compilador desactivadas de manera predeterminada.

Se puede resolver el error C4571 de una de las siguientes maneras:

  • Compile con /EHa si desea que los bloques catch(...) capturen excepciones estructuradas.

  • No habilite C4571 si no desea que los bloques catch(...) capturen excepciones estructuradas, pero aún quiere usar los bloques catch(...). Todavía puede detectar excepciones estructuradas mediante las palabras clave del control de excepciones estructuradas (__try, __except y __finally). Sin embargo recuerde que, cuando se compila mediante /EHs, solo se llama a los destructores cuando se produce una excepción de C++, no cuando se produce una excepción SEH.

  • Reemplace los bloques catch(...) por bloques catch para excepciones específicas de C++ y, opcionalmente, agregue el control estructurado de excepciones en torno al control de excepciones de C++ (__try, __except y __finally). para obtener más información, consulte Control estructurado de excepciones (C/C++) y /EH (Modelo de control de excepciones).

Ejemplo

El ejemplo siguiente genera el error 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
}