Una vez me aconsejaron que un programa C ++ debería capturar todas las excepciones. El razonamiento dado en ese momento era esencialmente que los programas que permiten que surjan excepciones fuera de main()
entrar en un extraño estado zombie. Me dijeron esto hace varios años y, en retrospectiva, creo que el fenómeno observado se debió a la larga generación de vertederos de núcleos excepcionalmente grandes del proyecto en cuestión.
En ese momento, esto parecía extraño pero convincente. Era totalmente absurdo que C ++ "castigara" a los programadores por no detectar todas las excepciones, pero la evidencia ante mí parecía respaldar esto. Para el proyecto en cuestión, los programas que arrojaron excepciones no detectadas parecían entrar en un extraño estado zombie, o como sospecho que la causa era ahora, un proceso en medio de un volcado de núcleo no deseado es inusualmente difícil de detener.
(Para cualquiera que se pregunte por qué esto no era más obvio en ese momento: el proyecto generó una gran cantidad de resultados en múltiples archivos de múltiples procesos que efectivamente ocultaron cualquier tipo de aborted (core dumped)
mensaje y, en este caso particular, el examen post mortem de los volcados del núcleo no fue Es una técnica de depuración importante, por lo que no se pensó mucho en los volcados del núcleo. Los problemas con un programa generalmente no dependían del estado acumulado de muchos eventos a lo largo del tiempo por un programa de larga duración, sino más bien las entradas iniciales a un programa de corta duración (< 1 hora), por lo que era más práctico volver a ejecutar un programa con las mismas entradas de una compilación de depuración o en un depurador para obtener más información).
Actualmente, no estoy seguro de si existe alguna ventaja o desventaja importante de capturar excepciones con el único fin de evitar que las excepciones se vayan main()
.
La pequeña ventaja que se me ocurre al permitir que surjan excepciones pasadas main()
es que hace que el resultado std::exception::what()
se imprima en el terminal (al menos con los programas compilados con gcc en Linux). Por otro lado, esto es trivial de lograr al capturar en su lugar todas las excepciones derivadas std::exception
e imprimir el resultado std::exception::what()
y, si es deseable imprimir un mensaje de una excepción que no se deriva de std::exception
él, debe capturarse antes de partir main()
para imprimir. el mensaje.
La desventaja modesta en la que puedo pensar para permitir que surjan excepciones main()
es que se pueden generar volcados de núcleos no deseados. Para un proceso que utiliza una gran cantidad de memoria, esto puede ser una molestia y controlar el comportamiento de volcado de núcleo de un programa requiere llamadas a funciones específicas del sistema operativo. Por otro lado, si se desea un volcado de núcleo y una salida, esto se podría lograr en cualquier momento llamando std::abort()
y una salida sin volcado de núcleo se puede lograr en cualquier momento llamando std::exit()
.
Como anécdota, no creo haber visto nunca el what(): ...
mensaje predeterminado impreso por un programa ampliamente distribuido al fallar.
¿Cuáles son, si los hay, los argumentos fuertes a favor o en contra de permitir que las excepciones de C ++ surjan main()
?
Editar: Hay muchas preguntas generales sobre el manejo de excepciones en este sitio. Mi pregunta es específicamente sobre las excepciones de C ++ que no se pueden manejar y que han llegado hasta el final main()
; tal vez se pueda imprimir un mensaje de error, pero es un error de detención que se muestra inmediatamente.