Vider les traces de pile de Goroutine dans Go
L’approche idiomatique pour faire face à des circonstances étranges consiste à utiliser des erreurs dans un programme Go. Les erreurs sont à l’origine de la majorité des cas inhabituels qui surviennent dans le logiciel.
Cependant, dans de rares cas, le logiciel ne pourra pas continuer à fonctionner en raison d’un état aberrant. Dans cette situation, la panic
peut mettre fin au programme plus tôt.
Lorsqu’une fonction rencontre une panic
, l’exécution de la fonction s’arrête, toutes les fonctions retardées s’exécutent et le contrôle revient à l’appelant de la fonction.
Cette procédure se poursuit jusqu’à ce que toutes les fonctions de la goroutine courante soient retournées, moment auquel le programme imprime le message panic
, puis la trace de la pile, avant de se terminer.
Lorsque nous construisons un exemple de programme, cela deviendra plus clair.
Utilisez panic
pour vider les traces de la pile Goroutine dans Go
Ce script simple imprimera le nom complet d’une personne. La fonction fullName
renvoie le nom complet d’une personne.
Cette méthode vérifie les valeurs nil
dans les pointeurs firstName
et lastName
. Si c’est nil
, la fonction envoie un signal panic
avec un message.
Une fois le programme terminé, il imprimera ce message.
package main
import (
"fmt"
)
func fullName(firstName *string, lastName *string) {
if firstName == nil {
panic("runtime error: first name cannot be nil")
}
if lastName == nil {
panic("runtime error: last name cannot be nil")
}
fmt.Printf("%s %s\n", *firstName, *lastName)
fmt.Println("returned normally from fullName")
}
func main() {
firstName := "Jay"
fullName(&firstName, nil)
fmt.Println("returned normally from main")
}
Production:
panic: runtime error: last name cannot be nil
goroutine 1 [running]:
main.fullName(0x405058?, 0xc000070f70?)
/tmp/sandbox885911142/prog.go:12 +0x114
main.main()
/tmp/sandbox885911142/prog.go:20 +0x35
Maintenant, l’exemple ci-dessous fait l’erreur commune de tenter d’accéder à l’élément final de la tranche en utilisant sa longueur fournie par le len
intégré.
Pour démontrer pourquoi cela peut provoquer une panic
, exécutez le code suivant.
package main
import (
"fmt"
)
func main() {
names := []string{
"Iron Man",
"Thor",
}
fmt.Println("My favorite superhero is:", names[len(names)])
}
Production:
panic: runtime error: index out of range [2] with length 2
goroutine 1 [running]:
main.main()
/tmp/sandbox2746930010/prog.go:12 +0x1b