son - ¿Qué debería saber sobre excepciones estructuradas(SEH) en C++?
manejo de excepciones en c++ pdf (4)
¿Qué puntos importantes acerca de las Excepciones Estructuradas debería saber cada desarrollador de C ++?
Deben saber que no son parte de Standard C ++; son invenciones de Microsoft y pueden usarse en otros lenguajes además de C ++.
Hace poco tuve un problema que fue causado indirectamente por SEH, específicamente debido a una característica de SEH que creo que cada desarrollador debe conocer:
Cuando se usa SEH, no se invocan 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 estaba envuelta por un objeto con Bloquear en el constructor y Desbloquear en el destructor.
Tuvimos una situación de punto muerto y no pudimos averiguar por qué, y después de aproximadamente una semana de investigar el código y los volcados y la depuración finalmente entendimos que era porque había una excepción manejada por COM y haciendo que la sección Critical permaneciera bloqueada . Cambiamos un indicador de compilación en VS en las propiedades del proyecto que le dicen que ejecute destructores incluso para SEH y que resolvió el problema.
Por lo tanto, aunque no use SEH en su código, puede estar utilizando una biblioteca que sí lo haga (como COM) y que pueda causar un comportamiento inesperado.
Son el equivalente de Win32 a las señales de Unix, y le permiten detectar excepciones de la CPU, como violación de acceso, instrucción ilegal, dividir por cero.
Con las opciones correctas del compilador (/ EHa para Visual C ++), las excepciones de C ++ utilizan el mismo mecanismo que el desenrollado de la pila funciona correctamente para excepciones de C ++ (usuario) y excepciones de SEH (OS).
A diferencia de las excepciones de C ++, los SEH no se escriben pero todos 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é registra la CPU en el momento de la falla. Consulte GetExceptionCode
y GetExceptionInformation
para obtener más detalles al respecto.
Además, SEH tiene un manejo de "primera oportunidad", que le permite registrar o manejar la excepción antes de que el desenredo destruya todas las variables locales.
Un curso acelerado sobre las profundidades del manejo estructurado de excepciones de Win32 ™
Ese artículo es la referencia para ponerse al día con SEH. 13 años después, sigue siendo el mejor que hay.
Existe un tema dedicado en MSDN para las diferencias de manejo de excepciones SEH vs. C ++ .
Algunas cosas que un desarrollador de C ++ debe saber si SEH se está discutiendo:
Escritura de controladores de excepciones C / C ++ SEH:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
Esto no es manejo de excepciones de C ++, son las extensiones específicas de MS para enganchar directamente en SEH. Funciona de manera muy diferente a las excepciones corrientes de C ++. Necesita una buena comprensión de SEH para usar estos.
Escritura de manipuladores de terminación C / C ++ SEH:
__try {
// guarded code
}
__finally ( expression ) {
// termination code
}
Igual que con el manejador SEH, no confunda esto con la semántica de excepción de C ++. Necesita una buena comprensión de SEH.
_set_se_trasnlator
: esta es la función que traduce las excepciones SEH en excepciones de tipo C ++ cuando se utilizan excepciones asincrónicas /EHa .
Y, por último, una opinión personal: ¿debería un desarrollador de C ++ conocer SEH? Después de su primer rookie .ecxr , comprenderá que, cuando llegue el momento, las excepciones de C ++ son solo una ilusión para su conveniencia. Lo único que sucede es SEH.