Tiendo a agregar muchas afirmaciones a mi código C ++ para facilitar la depuración sin afectar el rendimiento de las versiones de lanzamiento. Ahora, assert
es una macro C pura diseñada sin los mecanismos de C ++ en mente.
C ++, por otro lado std::logic_error
, define , que debe lanzarse en los casos en que haya un error en la lógica del programa (de ahí el nombre). Lanzar una instancia podría ser la alternativa perfecta, más C ++ ish a assert
.
El problema es que assert
, y abort
tanto por terminado el programa inmediatamente sin llamar a los destructores, por lo tanto, sin esperar la limpieza, mientras que lanzar una excepción de tiempo de ejecución añade manualmente los costos innecesarios. Una forma de evitar esto sería crear una macro de aserción propia SAFE_ASSERT
, que funciona como la contraparte de C, pero arroja una excepción en caso de falla.
Puedo pensar en tres opiniones sobre este problema:
- Cíñete a la afirmación de C. Dado que el programa se termina inmediatamente, no importa si los cambios se han desenrollado correctamente. Además, usar
#define
s en C ++ es igual de malo. - Lanza una excepción y capturala en main () . Permitir que el código omita los destructores en cualquier estado del programa es una mala práctica y debe evitarse a toda costa, al igual que las llamadas a terminate (). Si se lanzan excepciones, deben detectarse.
- Lanza una excepción y deja que termine el programa. Una excepción que finaliza un programa está bien y, debido a
NDEBUG
esto, esto nunca sucederá en una versión de lanzamiento. La captura es innecesaria y expone los detalles de implementación del código interno amain()
.
¿Existe una respuesta definitiva a este problema? ¿Alguna referencia profesional?
Editado: Saltar destructores no es, por supuesto, un comportamiento indefinido.
logic_error
es el error lógico. Un error en la lógica del programa se llama error. No resuelve errores lanzando excepciones.