Respuesta simple, nunca permita una excepción de un dtor!
La respuesta complicada. Solo se obtiene realmente clavado si la excepción escapa del dtor mientras hay otra excepción activa. El caso normal para esto es cuando ya está desenrollando la pila de otra excepción y el objeto en cuestión se destruye. En ese caso, si la excepción se escapa del dtor, se llama al std::terminate
, tenga en cuenta que puede poner su propio controlador para std::terminate
llamando al std::set_terminate
. La implementación predeterminada de std::terminate
es llamar a abortar.
Para complicar las cosas más mayoría de las funciones, que quieren hacer ninguna garantía sobre su seguridad excepción, sobre todo la garantía básica o la garantía fuerte, dependen de los tipos subyacentes a sí mismos no lanzar en su dtor *
La verdadera La pregunta es, ¿en qué estado estaría su programa cuando ocurra este error? ¿Cómo te puedes recuperar? ¿Dónde debe manejarse esta recuperación? Necesita ver su caso específico y resolver estos problemas. A veces está bien atrapar la excepción e ignorarla. Otras veces necesita levantar algunas banderas rojas.
Así que la respuesta es: permitió C++ lanzar una excepción en un dtor, pero nunca deberías permitir que escapara.
* He aquí una breve synopsis de las garantías de excepción (aquí hay un mucho más tiempo article)
- Resumen: definir brevemente las garantías Abrahams seguridad excepción (básico, fuertes, y nothrow).
La garantía básica es que fallaron operaciones pueden alterar el estado del programa, pero no se producen fugas y afectados objetos/módulos son todavía destructible y utilizable, en un estado coherente (pero no necesariamente predecible).
El fuerte garantía implica transaccional commit/rollback semántica: No se pudo operaciones de garantía estado del programa no se ha modificado con respecto a los objetos intervenidos. Esto significa que no hay efectos secundarios que afecten a los objetos , incluida la validez o contenidos de los objetos auxiliares relacionados , como los iteradores que apuntan a los contenedores que se están manipulando.
La garantía nohrow significa que las operaciones fallidas de no sucederán. La operación no lanzará una excepción.
Solo para aclararlo, ¿estás preguntando si está bien si el destructor detecta la excepción, por lo que nunca abandona el destructor, o si está bien dejar que abandone el destructor siempre que está atrapado afuera? – jalf
Pregunto si está bien si la excepción permanece en el D'tor. –