El uso exit()está bien
Dos aspectos importantes del diseño de código que aún no se han mencionado son el "subproceso" y las "bibliotecas".
En un programa de un solo subproceso, en el código que está escribiendo para implementar ese programa, el uso exit()está bien. Mis programas lo usan de forma rutinaria cuando algo sale mal y el código no se recupera.
Pero…
Sin embargo, llamar exit()es una acción unilateral que no se puede deshacer. Es por eso que tanto el "subproceso" como las "bibliotecas" requieren una reflexión cuidadosa.
Programas enhebrados
Si un programa tiene varios subprocesos, entonces usar exit()es una acción dramática que termina todos los subprocesos. Probablemente sea inapropiado salir de todo el programa. Puede ser apropiado salir del hilo y reportar un error. Si conoce el diseño del programa, entonces tal vez esa salida unilateral esté permitida, pero en general, no será aceptable.
Código de biblioteca
Y esa cláusula "consciente del diseño del programa" también se aplica al código de las bibliotecas. Rara vez es correcto llamar a una función de biblioteca de propósito general exit(). Estaría muy molesto si una de las funciones estándar de la biblioteca de C no regresara solo por un error. (Obviamente, las funciones como exit(), _Exit(), quick_exit(), abort()no están destinados a retorno; que es diferente). Las funciones de la biblioteca C, por lo tanto, ya sea "no pueden fallar" o devolver una indicación de error de alguna manera. Si está escribiendo código para ir a una biblioteca de propósito general, debe considerar cuidadosamente la estrategia de manejo de errores para su código. Debe encajar con las estrategias de manejo de errores de los programas con los que se pretende usar, o el manejo de errores puede ser configurable.
Tengo una serie de funciones de biblioteca (en un paquete con encabezado "stderr.h", un nombre que camina sobre hielo fino) que están destinadas a salir ya que se usan para informar de errores. Esas funciones salen por diseño. Hay una serie de funciones relacionadas en el mismo paquete que informan de errores y no salen. Las funciones salientes se implementan en términos de las funciones no salientes, por supuesto, pero eso es un detalle de implementación interna.
Tengo muchas otras funciones de biblioteca, y muchas de ellas se basan en el "stderr.h"código para informar de errores. Esa es una decisión de diseño que tomé y estoy de acuerdo. Pero cuando los errores se reportan con las funciones que salen, limita la utilidad general del código de la biblioteca. Si el código llama a las funciones de informe de errores que no salen, entonces las rutas del código principal en la función tienen que lidiar con los retornos de error de manera sensata: detectelos y transmita una indicación de error al código de llamada.
El código para mi paquete de informes de errores está disponible en mi repositorio SOQ (Stack Overflow Questions) en GitHub como archivos stderr.cy stderr.hen el subdirectorio src / libsoq .