Maison  >  Article  >  développement back-end  >  Comment gérer les paniques dans les routines Go : comprendre la portée de la récupération ?

Comment gérer les paniques dans les routines Go : comprendre la portée de la récupération ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-07 03:13:02833parcourir

How to Handle Panics in Go Routines: Understanding Recover Scope?

Gestion des paniques dans les routines Go

Go fournit les fonctions intégrées panic() et recovery() pour gérer les erreurs inattendues et les conditions fatales dans code en cours d'exécution. Pour gérer les paniques dans une routine Go, il est essentiel de comprendre la portée de recovery().

Comprendre la portée de recovery()

recover() ne peut récupérer que des paniques au sein du même goroutine qui a semé la panique. Si une panique se produit dans une goroutine sans recovery() actif, l'ensemble du programme plantera.

Exemple avec une gestion incorrecte des erreurs

L'exemple de code fourni dans la question ne parvient pas à gérer une panique car recovery() est défini dans la routine principale, tandis que la panique est déclenchée dans la goroutine handle(). Par conséquent, recovery() ne peut pas accéder à la valeur de panique.

func main() {
    // ...

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    fmt.Println(*a) // Panic here
    done <- *a      // Dereferencing nil pointer
}

Exemple de gestion correcte des erreurs

Pour gérer les paniques déclenchées dans une goroutine, placez le recovery () dans la goroutine elle-même.

func main() {
    // ...

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered")
        }
    }()

    go handle(done)
    // ...
}

func handle(done chan int64) {
    // ...
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered")
        }
    }()

    fmt.Println(*a) // Panic here
    done <- *a      // Dereferencing nil pointer
}

Explication

Dans cet exemple corrigé, recovery() est maintenant dans la goroutine handle(), il peut donc capturer la panique suscitée par le déréférencement du pointeur nul. La panique est ensuite récupérée et le message « Récupéré » est imprimé.

Comprendre la portée de recovery() est crucial pour une gestion efficace des erreurs dans les routines Go. Placez toujours recovery() dans la même goroutine où la panique pourrait survenir pour gérer et signaler avec élégance toute condition inattendue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn