¿Qué debo saber sobre las excepciones estructuradas (SEH) en C++?

¿Qué debo saber sobre las excepciones estructuradas (SEH) en C++?

Son el equivalente de Win32 a las señales de Unix y le permiten detectar excepciones de la CPU, como infracciones de acceso, instrucciones ilegales, dividir por cero.

Con las opciones de compilación correctas (/EHa para Visual C++), las excepciones de C++ usan el mismo mecanismo que el desenrollado de pila que funciona correctamente tanto para las excepciones de C++ (usuario) como para las excepciones de SEH (SO).

A diferencia de las excepciones de C++, las SEH no se escriben, pero todas comparten la misma estructura de datos que tiene un código de excepción (la causa) e información adicional sobre qué código falló y qué registros de la CPU tenían en el momento de la falla. Ver GetExceptionCode y GetExceptionInformation para más detalles sobre esto.

Además, SEH tiene manejo de "primera oportunidad", lo que le permite registrar o manejar la excepción antes el desenrollado destruye todas las variables locales.


Recientemente tuve un problema causado indirectamente por SEH, específicamente debido a una característica de SEH que creo que todo desarrollador debería conocer:

Cuando se usa SEH, no se llama a los destructores, por lo que si tiene un código de limpieza en su destructor, no se limpiará.

Nuestro problema fue causado por una Sección Crítica que fue envuelta por un objeto con Bloquear en el constructor y Desbloquear en el destructor.

Tuvimos una situación de punto muerto y no pudimos entender por qué, y después de aproximadamente una semana de investigar el código, los volcados y la depuración, finalmente entendimos que se debía a que COM manejaba una excepción y causaba que la sección Crítica permaneciera bloqueada. .Cambiamos un indicador de compilación en VS en las propiedades del proyecto que le indica que ejecute destructores incluso para SEH y eso resolvió el problema.

Entonces, aunque es posible que no use SEH en su código, puede estar usando una biblioteca que sí lo hace (como COM) y eso puede causar un comportamiento inesperado.


Deben saber que no forman parte del estándar C++:son una invención de Microsoft y se pueden usar en otros lenguajes además de C++.