programacion orientada objetos herencia ejemplo constructores clases c++ exception

orientada - ¿Cuándo está bien lanzar una excepción desde un destructor en C++?



herencia c++ constructores (7)

Debería garantizar que no se está llamando al destructor, debido a otra excepción.

Dicho esto, no utilizo excepciones. Pero si tuviera que usarlos para mantener mi trabajo, nunca lanzaría una excepción de un destructor.

Sé que la regla es NUNCA arrojar uno durante un destructor, y entiendo por qué. No me atrevería a hacerlo. Pero incluso el C ++ Faq Lite dice que esta regla es buena el 99% del tiempo. ¿Cuál es el otro 1% que no pueden profundizar?

Enlace al punto de viñeta C ++ Faq Lite al lanzar desde ~ ():


Si la destrucción es parte de un proceso controlado, entonces sería aceptable, pero aún así, debe deshacerse de las referencias restantes tanto como sea posible, por lo que tirar podría no ser bueno.

La destrucción puede ocurrir implícitamente tan a menudo que un lanzamiento puede romper la lógica del código normal.


Si todo está tan defectuoso que desea que el programa termine a través del flujo de código de excepción.


Simplemente no lo hagas. Si las estrellas y los planetas se alinean de tal manera que encuentres que necesitas ...

Aún no lo hagas


Supongo que si pudieras detectar de manera confiable una situación realmente mala dentro de un destructor, una que era tan mala que no había una buena manera de manejarla, y tenías que asegurarte de que el proceso se detuviera AHORA antes de que sucediera algo más ... ( imagina una computadora conectada a un arma o un misil nuclear) pero otros dos pensamientos te vienen a la mente:

  1. En lugar de lanzar una excepción, sería mejor llamar a exit () o abort () o TerminateProcess () o algo que detenga explícitamente las cosas, en lugar de asumir que usted sabe lo que el compilador convertirá su "throw a exception in the destructor" en cuando compila

  2. Este es más un ejemplo artificial. Las verificaciones de seguridad extremas deben manejarse en una función real que se ejecuta a propósito en tiempos bien definidos (o mejor aún, manejada en hardware o procesadores redundantes) y no como una ocurrencia tardía durante un destructor.


Guau, estaba a punto de votar a Juan hasta que vi la parte sobre nunca usar excepciones.

De acuerdo, primero que nada, Juan lo tiene correcto. Si, por el motivo que sea , terminas en esa situación de dos excepciones que se persiguen entre sí, C ++ simplemente levantará las manos y su última comida y terminará anormalmente. Por lo tanto, lanzar una excepción desde un dtor es una garantía de que tiene una ruta de código posible que conduce a una terminación anormal no planificada, que en general es algo malo. Si eso es lo que quieres , sé sencillo al respecto, llama al aborto o a la salida, y termina de una vez.

La parte sobre evitarlo al no usar excepciones, sin embargo, es un mal consejo. Las excepciones son realmente un mecanismo esencial en C ++ para sistemas que serán robustos y se ejecutarán durante mucho tiempo; en realidad son la única forma de garantizar que pueda manejar situaciones de error sin tener que filtrar recursos por todos lados.

Sucede que solía trabajar para Marshall Cline, el tipo que escribió esas preguntas frecuentes, y enseñó C ++ del libro de preguntas frecuentes; por eso, puedo decirte que estás malinterpretando la respuesta un poco. No dice "caramba, hay un caso en el que estaría bien, pero no voy a eludirlo", está diciendo "Estoy seguro de que si digo absolutamente y sin excepción no arrojaré de un día, alguien, algún día, dará con un ejemplo sencillo que tenga sentido. Pero no sé de uno y realmente no lo creo. No intente esto en casa, y consulte a un abogado, ninguna garantía expresa o implícita ".


Puede lanzar una excepción desde un destructor si este destructor no se llama automáticamente durante el desenrollado de la pila, o lanzar la excepción dará como resultado una llamada de terminate (). Para determinar si es seguro lanzar excepciones desde un destructor, use la función estándar uncaught_exception (); si devuelve falso, es seguro lanzar una excepción