programming - golang step by step
¿Cuándo usar os.Exit() y panic()? (3)
¿Podría alguien explicar las diferencias clave entre
os.Exit()
y
panic()
y cómo se usan en la práctica en Go?
En primer lugar,
os.Exit()
se puede usar para salir del programa normalmente sin errores y no entrar en pánico, por lo que esa es una distinción clave.
Otra es que el pánico en algún lugar puede ser atrapado e ignorado o registrado mediante la
recover
.
Pero si estamos hablando de un código de salida erróneo, digamos:
Utilice el
panic
cuando algo salga terriblemente mal, probablemente un error del programador que debería haberse detectado antes de pasar a producción.
Por eso imprime la pila.
Use
os.Exit(errorCode)
o algo así si desea:
-
controlar el código de salida del programa para fines de secuencias de comandos.
-
desea una salida ordenada en un error esperado (por ejemplo, error de entrada del usuario).
Entonces, básicamente, el pánico es para ti, un código de salida incorrecto es para tu usuario.
En primer lugar, siempre que tenga una pregunta de "cómo se usa en la práctica", una buena manera de comenzar es search el código fuente de Go (o cualquier base de código Go lo suficientemente grande, en realidad), y el paquete de documentos para obtener respuestas.
Ahora,
os.Exit
y
panic
son bastante diferentes.
panic
se usa cuando el programa, o su parte, ha alcanzado un estado irrecuperable.
Cuando se
panic
, incluido implícitamente los errores de tiempo de ejecución, como indexar un corte fuera de los límites o fallar una aserción de tipo, inmediatamente detiene la ejecución de la función actual y comienza a desenrollar la pila de la rutina, ejecutando cualquier función diferida en el camino . Si ese desenrollamiento alcanza la parte superior de la pila de gorutinas, el programa muere.
os.Exit
se usa cuando necesita abortar el programa
inmediatamente,
sin posibilidad de recuperación o ejecución de una declaración de limpieza diferida, y también devuelve un código de error (que otros programas pueden usar para informar lo que sucedió).
Esto es útil en las pruebas, cuando ya sabe que después de que una prueba falla, la otra también fallará, por lo que es mejor que salga ahora.
Esto también se puede usar cuando su programa ha hecho todo lo que tenía que hacer y ahora solo necesita salir, es decir, después de imprimir un mensaje de ayuda.
La mayoría de las veces no usará el
panic
(debería devolver un
error
lugar), y casi nunca necesitará
os.Exit
fuera de algunos casos en las pruebas y para la finalización rápida del programa.
Las diferencias clave son:
-
os.Exit
omite la ejecución de la función diferida. -
Con
os.Exit
, puede especificar el código de salida. -
panic
termina mientras queos.Exit
no. (Parece que otras respuestas no mencionan esto).
Si necesita ejecutar la función diferida, no tiene más remedio que
panic
.
(Por otro lado, si desea omitir la ejecución de la función diferida, use
os.Exit
).
Si una función no nula se define de esta manera:
- la función contiene muchas ramas
-
todas las ramas se terminan con
return
opanic
Entonces no puede reemplazar el
panic
con
os.Exit
contrario el compilador se negará a compilar el programa, diciendo "falta el retorno al final de la función".
(Ir es muy tonto aquí, incluso
log.Panic
no termina una función).
En otras condiciones:
-
Utilice el
panic
cuando ocurra algo realmente cableado, por ejemplo, error de lógica de programación. -
Use
os.Exit
cuando desee una salida inmediata, con el código de salida especificado.