Jerry dijo: ... el resultado ya no es C ++ , mientras que mi metáfora es que es claramente C ++, solo un dialecto ligeramente diferente porque los programas utilizan otras formas, convenciones y estilos escritos.
Aquí están mis razones principales para deshabilitarlas:
Compatibilidad binaria
Cruzar los límites del idioma y la traducción no está universalmente bien definido o indefinido. Si desea garantizar que su programa funcione dentro del dominio de comportamiento definido, deberá poner en cuarentena las excepciones en los puntos de salida del módulo.
Tamaño ejecutable
Aquí están los tamaños binarios de un programa libre de excepciones que escribí, creado sin y con excepciones habilitadas:
Sin excepciones:
- ejecutable + dependencias: 330
- ejecutable despojado final (versión de lanzamiento): 37
Con excepciones:
- ejecutable + dependencias: 380
- ejecutable despojado final (compilación de lanzamiento): 44
Recordatorio: es una colección de bibliotecas y programas que contienen cero lanzamientos / capturas. La bandera compilador hace permitir excepciones en la biblioteca estándar de C ++. Por lo tanto, el costo en el mundo real es más del 19% visto en este ejemplo.
Compilador: apple gcc4.2 + llvm. Tamaños en MB.
Velocidad
A pesar del término "excepciones de costo cero", todavía agregan algunos gastos generales incluso cuando nada arroja. En el caso anterior, es un programa crítico de rendimiento (procesamiento de señales, generación, presentación, conversiones, con grandes conjuntos de datos / señales, etc.). Las excepciones no son una característica necesaria en este diseño, mientras que el rendimiento es muy importante.
Corrección del programa
Parece una razón extraña ... Si lanzar no es una opción, debe escribir programas relativamente estrictos, correctos y bien probados para garantizar que su programa se ejecute correctamente, y que los clientes usen las interfaces correctamente (si me da un mal argumento o no lo hace) No verifique un código de error, entonces se merece UB). ¿El resultado? La calidad de la implementación mejora enormemente y los problemas se solucionan rápidamente.
Sencillez
Las implementaciones de manejo de excepciones a menudo no se mantienen actualizadas. También agregan mucha complejidad porque una implementación puede tener muchas, muchas, muchas secuencias de salida. Es más sencillo leer y mantener programas altamente complejos cuando utilizan un pequeño conjunto de estrategias de salida bien definidas, tipadas, que surgen y son manejadas por el cliente. En otros casos, las implementaciones pueden con el tiempo implementar más lanzamientos o sus dependencias pueden introducirlos. Los clientes no pueden defenderse fácil o adecuadamente contra todas estas salidas. Escribo y actualizo muchas bibliotecas, hay una evolución y una mejora frecuentes. Intentar mantener todo sincronizado con las secuencias de salida de excepción (en una base de código grande) no sería un buen uso del tiempo y probablemente agregaría mucho ruido y ruido. Debido a la mayor corrección del programa y más pruebas,
Historia / Código existente
En algunos casos, nunca se introdujeron por razones históricas. Una base de código existente no los usaba, cambiar los programas podría llevar muchos años y hacer que sea realmente feo de mantener debido a la superposición de convenciones e implementaciones.
Desventajas
Por supuesto, hay inconvenientes, los más importantes son: incompatibilidad (incluido binario) con otras bibliotecas, y el hecho de que tendrá que implementar una buena cantidad de programas para adaptarse a este modelo.