web-dev-qa-db-fra.com

Quand utiliser os.Exit () et panic ()?

Quelqu'un pourrait-il expliquer les principales différences entre os.Exit() et panic() et leur utilisation pratique dans Go?

82
Timur Fayzrakhmanov

Tout d’abord, chaque fois que vous vous posez la question "comment on l’utilise dans la pratique", un bon moyen de commencer est de rechercher le code source de Go (ou toute base de code suffisamment grande, vraiment) , et le package docs pour les réponses.

Maintenant, os.Exit et panic sont très différents. panic est utilisé lorsque le programme, ou sa partie, a atteint un état irrécupérable.

Lorsque panic est appelé, y compris implicitement pour les erreurs d’exécution telles que l’indexation d’une tranche en dehors des limites ou l’échec d’une assertion de type, il arrête immédiatement l’exécution de la fonction en cours et commence à dérouler la pile de la goroutine, en exécutant toute fonctions différées en cours de route. Si le déroulement atteint le sommet de la pile de la goroutine, le programme meurt.

os.Exit est utilisé lorsque vous devez abandonner le programme immédiatement, sans possibilité de récupération ni d'exécuter une instruction de nettoyage différée, mais aussi renvoyer une erreur. code (que d'autres programmes peuvent utiliser pour signaler ce qui s'est passé). Ceci est utile dans les tests, lorsque vous savez déjà qu'après l'échec de l'un des tests, les autres échoueront également. Vous pouvez donc vous contenter de quitter maintenant. Ceci peut également être utilisé lorsque votre programme a fait tout ce qu'il devait faire et qu'il ne lui reste plus qu'à quitter, c'est-à-dire après avoir imprimé un message d'aide.

La plupart du temps, vous n'utiliserez pas panic (vous devriez renvoyer un error à la place), et vous n'avez presque jamais besoin de os.Exit en dehors de certains cas lors des tests et de la fermeture rapide du programme.

70
Ainar-G

Tout d’abord, os.Exit() peut être utilisé pour quitter le programme normalement sans erreur et sans panique, c’est une distinction essentielle. Une autre possibilité est que la panique puisse être détectée et ignorée ou consignée quelque part, en utilisant recover.

Mais si nous parlons d'un code de sortie erroné, disons:

Utilisez panic lorsque quelque chose ne va pas, il s'agit probablement d'une erreur de programmation qui aurait dû être détectée avant de passer en production. C'est pourquoi il imprime la pile.

Utilisez os.Exit(errorCode) ou quelque chose comme ça si vous voulez:

  1. contrôler le code de sortie du programme à des fins de script.

  2. voulez une sortie ordonnée sur une erreur attendue (par exemple une erreur de saisie de l'utilisateur).

Donc, fondamentalement, la panique est pour vous, un mauvais code de sortie est pour votre utilisateur.

71
Not_a_Golfer

Les principales différences sont les suivantes:

  1. os.Exit ignore l'exécution de la fonction différée.
  2. Avec os.Exit, vous pouvez spécifier le code de sortie.
  3. panic se termine alors que os.Exit n'est pas. (Il semble que d'autres réponses ne le mentionnent pas.)

Si vous avez besoin d'exécuter la fonction différée, vous n'avez pas d'autre choix que panic. (Par contre, si vous voulez ignorer l'exécution d'une fonction différée, utilisez os.Exit.)

Si une fonction non vide est définie de cette manière:

  1. la fonction contient beaucoup de branches
  2. toutes les branches sont terminées avec return ou panic

Ensuite, vous ne pouvez pas remplacer panic par os.Exit sinon le compilateur refusera de compiler le programme en disant "retour manquant à la fin de la fonction". (Go est très stupide ici, même log.Panic ne met pas fin à une fonction.)

Dans d'autres conditions:

  1. Utilisez panic lorsque quelque chose de vraiment câblé se produit, par ex. erreur de logique de programmation.
  2. Utilisation os.Exit lorsque vous souhaitez une sortie immédiate, avec le code de sortie spécifié.
2
weakish