application - salir en c++
¿Uso correcto de exit() en c++? (6)
He escrito una aplicación sencilla que lee un archivo de datos, analiza el texto y luego realiza un procesamiento de esos datos. El archivo de datos se abre en mi función principal (). ¿Es una buena práctica de programación usar la función exit () si se determina que el archivo no se abrió correctamente? p.ej:
if (!file.is_open() ){
exit(1);
}
Además, mi programa tiene una función separada para analizar los datos en el archivo. Esta función es llamada por main (). Si la función encuentra un error en los datos, quiero que el programa se detenga, después de imprimir un mensaje de error. En tal situación, ¿es aceptable usar la función exit () dentro de mi función de análisis? Estoy haciendo esta pregunta porque, para mí, no parece ser muy ordenado permitir que una función salga de un programa por sí misma sin devolver el control a la función main (). (Pido disculpas si esta pregunta parece bastante obvia ... Soy nuevo en C ++ y en la programación en general).
Depende de donde venga esa exit(1)
. No debe llamar a esta exit(1)
desde una biblioteca, solo desde su propia aplicación.
Si necesita establecer un código de error, puede establecer un error (la variable STD C, sí).
Si desea probar una forma más C ++, puede lanzar una excepción, con un código de error detallado.
Desde main
no hay diferencia en la exit(1)
o return 1
. Utiliza un valor de retorno / salida de 0
para el éxito y no 0
para el fracaso.
Si su subrutina es una rutina de biblioteca, que se usa en otro lugar, debe devolver el control a main con algún código de retorno o una excepción. De lo contrario es su elección, si exit
o regresa.
En cualquier caso, es una buena práctica documentar lo que hace la función, ya sea exit
, código de return
o exception
.
Hay dos aspectos. Uno es el interés de decidir detener el programa en el lugar donde desea utilizar exit
, el otro es el uso de exit. La respuesta de Mat cubre la primera.
Para el segundo, la exit
suele ser una mala elección en C ++. La razón es que realiza algunas atexit
limpieza (funciones registradas con atexit
y que a veces incluyen destructores de algunos objetos de duración de almacenamiento estático), pero no todos (destructores de objetos en la pila) y en mi experiencia, o bien lo quieren todo. o ninguno
La salida es aceptable, aunque creo que es importante tener en cuenta que las diferencias en la memoria al usar la salida frente a una declaración de retorno en esa salida no destruirán las variables en la memoria. Si hay algún error, entonces la salida está justificada. De lo contrario, me apegaría a la declaración de retorno.
Llamar a exit
desde una función no es "malo" en el sentido de que tiene un comportamiento bien definido; no hay nada fundamentalmente incorrecto al hacerlo.
Pero, si está escribiendo una función que podría terminar en una biblioteca, por ejemplo, llamar a exit
desde allí es una mala práctica en general: es mucho mejor señalar un error al código de llamada (a través de un valor de retorno específico o una excepción para instancia) y deje que el código de llamada decida qué hacer. (Sin embargo, hay casos en los que es perfectamente válido. Por ejemplo, si está escribiendo una función llamada quit_if_file_not_found
, los usuarios esperan una terminación).
En su caso, su función de análisis probablemente no debería llamar a exit
: es posible que desee, por ejemplo, en algún momento en el futuro, su código principal para pedirle al usuario un nombre de archivo diferente si el análisis del primero falló. Si su rutina de análisis finaliza el programa, debe modificar tanto su código principal como esa función. Si hubiera señalado una condición de error, solo tendría que modificar la lógica en main
.
(Y no solo exit
sin imprimir un mensaje de error o registrar algo como lo está haciendo arriba, eso hará que los usuarios frustrados que no pueden saber cómo solucionar cualquier problema es el código encontrado).
exit(0)
indica la finalización exitosa del programa y es totalmente portátil, aunque
exit(1)
(normalmente) indica una terminación sin éxito. Sin embargo, su uso no es portátil.