No es exactamente cierto que "afirmar falla solo en modo de depuración".
En Construcción de software orientado a objetos, segunda edición de Bertrand Meyer, el autor deja una puerta abierta para verificar las condiciones previas en el modo de lanzamiento. En ese caso, lo que sucede cuando falla una aserción es que ... ¡se genera una excepción de violación de aserción! En este caso, no hay recuperación de la situación: sin embargo, se podría hacer algo útil, y es generar automáticamente un informe de error y, en algunos casos, reiniciar la aplicación.
La motivación detrás de esto es que las condiciones previas son generalmente más baratas de probar que las invariantes y las condiciones posteriores, y que en algunos casos la corrección y la "seguridad" en la versión de lanzamiento son más importantes que la velocidad. es decir, para muchas aplicaciones, la velocidad no es un problema, sino la robustez (la capacidad del programa de comportarse de manera segura cuando su comportamiento no es correcto, es decir, cuando se rompe un contrato).
¿Debería dejar siempre habilitados los controles de precondición? Depende. Tu decides. No hay una respuesta universal. Si está creando software para un banco, podría ser mejor interrumpir la ejecución con un mensaje alarmante que transferir $ 1,000,000 en lugar de $ 1,000. Pero, ¿y si estás programando un juego? Tal vez necesite toda la velocidad que pueda obtener, y si alguien obtiene 1000 puntos en lugar de 10 debido a un error que las condiciones previas no detectaron (porque no están habilitadas), mala suerte.
En ambos casos, idealmente debería haber detectado ese error durante la prueba, y debería hacer una parte significativa de su prueba con las aserciones habilitadas. Lo que se está discutiendo aquí es cuál es la mejor política para aquellos casos raros en los que las condiciones previas fallan en el código de producción en un escenario que no se detectó antes debido a pruebas incompletas.
Para resumir, puede tener afirmaciones y aún obtener las excepciones automáticamente , si las deja habilitadas, al menos en Eiffel. Creo que para hacer lo mismo en C ++, debe escribirlo usted mismo.
Ver también: ¿ Cuándo deben permanecer las afirmaciones en el código de producción?