Hace más de 10 años, en la escuela, te estaban enseñando a usar los especificadores de excepción. Ya que mi experiencia es como uno de ellos, los programadores de Torvaldish C que evitan obstinadamente a C ++ a menos que sean forzados a hacerlo, solo termino en C ++ esporádicamente, y cuando lo hago, todavía uso especificadores de excepción, ya que eso es lo que me enseñaron.
Sin embargo, la mayoría de los programadores de C ++ parecen fruncir el ceño ante los especificadores de excepción. He leído el debate y los argumentos de varios gurús de C ++, como estos . Hasta donde lo entiendo, se reduce a tres cosas:
- Los especificadores de excepciones usan un sistema de tipos que es inconsistente con el resto del idioma ("sistema de tipo de sombra").
- Si su función con un especificador de excepción arroja otra cosa que no sea lo que usted especificó, el programa terminará de manera incorrecta e inesperada.
- Los especificadores de excepción se eliminarán en el próximo estándar de C ++.
¿Me estoy perdiendo algo aquí o son todas estas razones?
Mis propias opiniones:
Con respecto a 1): ¿Y qué. C ++ es probablemente el lenguaje de programación más inconsistente jamás creado, sintaxis. Tenemos las macros, el goto / labels, la horda (hoard?) De comportamiento indefinido- / no especificado- / implementación definida, los tipos de enteros mal definidos, todas las reglas de promoción de tipo implícito, palabras clave de casos especiales como amigo, auto , registro, explícito ... Y así sucesivamente. Alguien podría probablemente escribir varios libros gruesos de todas las rarezas en C / C ++. Entonces, ¿por qué las personas reaccionan contra esta inconsistencia particular, que es un defecto menor en comparación con muchas otras características mucho más peligrosas del lenguaje?
En relación con 2): ¿No es mi responsabilidad? Hay muchas otras formas en que puedo escribir un error fatal en C ++, ¿por qué este caso en particular es peor? En lugar de escribir throw(int)
y luego lanzar Crash_t, puedo afirmar que mi función devuelve un puntero a int, luego hacer un encasillado explícito y devolver un puntero a un Crash_t. El espíritu de C / C ++ siempre ha sido dejar la mayor parte de la responsabilidad al programador.
¿Qué hay de las ventajas entonces? Lo más obvio es que si su función intenta lanzar explícitamente cualquier tipo distinto de lo que especificó, el compilador le dará un error. Creo que la norma es clara respecto a esto (?). Los errores solo ocurrirán cuando su función llame a otras funciones que a su vez arrojan el tipo incorrecto.
Proveniente de un mundo de programas de C incrustados y deterministas, sin duda preferiría saber exactamente qué me ofrecerá una función. Si hay algo en el lenguaje que lo respalde, ¿por qué no usarlo? Las alternativas parecen ser:
void func() throw(Egg_t);
y
void func(); // This function throws an Egg_t
Creo que hay una gran posibilidad de que la persona que llama ignore / olvide implementar el try-catch en el segundo caso, menos en el primer caso.
Tal como lo entiendo, si cualquiera de estos dos formularios decide lanzar repentinamente otro tipo de excepción, el programa se bloqueará. En el primer caso porque no está permitido lanzar otra excepción, en el segundo caso porque nadie esperaba que lanzara una SpanishInquisition_t y, por lo tanto, esa expresión no se encuentra donde debería haber estado.
En el caso de este último, tener una captura de último recurso (...) en el nivel más alto del programa realmente no parece ser mejor que un bloqueo del programa: "Oye, en algún lugar de tu programa algo arrojó un extraño , Excepción no controlada.". No puedes recuperar el programa una vez que estés tan lejos de donde se lanzó la excepción, lo único que puedes hacer es salir del programa.
Y desde el punto de vista del usuario, no les importa si reciben un cuadro de mensaje malvado del sistema operativo que dice "El programa terminó. Blablabla en la dirección 0x12345" o un cuadro de mensaje malvado de su programa que dice "Excepción no controlada" : myclass.func.something ". El error sigue ahí.
Con el próximo estándar de C ++ no tendré otra opción que abandonar los especificadores de excepción. Pero preferiría escuchar algún argumento sólido de por qué son malos, en lugar de "Su Santidad lo ha declarado y por lo tanto es así". Quizás haya más argumentos en contra de ellos que los que enumeré, o tal vez haya más en ellos de lo que creo.