Quelqu'un pourrait-il expliquer les principales différences entre os.Exit()
et panic()
et leur utilisation pratique dans Go?
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.
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:
contrôler le code de sortie du programme à des fins de script.
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.
Les principales différences sont les suivantes:
os.Exit
ignore l'exécution de la fonction différée.os.Exit
, vous pouvez spécifier le code de sortie.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:
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:
panic
lorsque quelque chose de vraiment câblé se produit, par ex. erreur de logique de programmation.os.Exit
lorsque vous souhaitez une sortie immédiate, avec le code de sortie spécifié.