Vider les traces de pile de Goroutine dans Go

Jay Singh 23 aout 2022
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