Go Récupérer de la panique


Exemple

Une erreur courante est de déclarer une tranche et de commencer à demander des index sans l'initialiser, ce qui conduit à une panique "d'index hors de portée". Le code suivant explique comment se remettre de la panique sans quitter le programme, ce qui est le comportement normal d'une panique. Dans la plupart des cas, le fait de renvoyer une erreur de cette manière plutôt que de quitter le programme en panique n'est utile que pour le développement ou les tests.

type Foo struct {
    Is []int
}

func main() {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        fmt.Printf("Error: %v", err)
    } 
    fmt.Println("ok")
}

func (fp *Foo) Panic() (err error) {
    defer PanicRecovery(&err)
    fp.Is[0] = 5
    return nil
}

func PanicRecovery(err *error) {

    if r := recover(); r != nil {
        if _, ok := r.(runtime.Error); ok {
             //fmt.Println("Panicing")
             //panic(r)
             *err = r.(error) 
        } else {
            *err = r.(error)
        }
    }
}

L'utilisation d'une fonction distincte (plutôt que la fermeture) permet de réutiliser la même fonction dans d'autres fonctions sujettes à la panique.