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 bloquescatch(...)
capturen excepciones estructuradas.No habilite C4571 si no desea que los bloques
catch(...)
capturen excepciones estructuradas, pero aún quiere usar los bloquescatch(...)
. 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
}