tutorial programming language golang for example go exit

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:

  1. controlar el código de salida del programa para fines de secuencias de comandos.

  2. 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:

  1. os.Exit omite la ejecución de la función diferida.
  2. Con os.Exit , puede especificar el código de salida.
  3. panic termina mientras que os.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:

  1. la función contiene muchas ramas
  2. todas las ramas se terminan con return o panic

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:

  1. Utilice el panic cuando ocurra algo realmente cableado, por ejemplo, error de lógica de programación.
  2. Use os.Exit cuando desee una salida inmediata, con el código de salida especificado.