Maison > développement back-end > Golang > Comment gérer les paniques dans des routines Go séparées ?

Comment gérer les paniques dans des routines Go séparées ?

DDD
Libérer: 2024-11-07 20:36:02
original
444 Les gens l'ont consulté

How to Handle Panics in Separate Go Routines?

Gérer les paniques dans les routines Go

Lorsqu'une panique survient dans une routine Go, il est essentiel de la gérer correctement. L'utilisation de la fonction de récupération peut récupérer efficacement la valeur de panique et la gérer en conséquence.

Une approche courante consiste à gérer les paniques dans la fonction principale à l'aide de fonctions différées. Cependant, lorsque la panique se produit dans une goroutine distincte, cette approche ne parvient pas à la capturer.

Dans l'exemple donné :

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Copier après la connexion

La panique se produit dans la fonction handle au sein de la goroutine, mais la fonction de récupération différée dans la fonction principale ne peut pas la capturer. En effet, recovery ne fonctionne que lorsqu'il est invoqué dans la même goroutine d'où la panique est originaire.

Pour résoudre ce problème, déplacez l'appel de la fonction de récupération différée dans la fonction handle :

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

func handle(done chan int64) {
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Copier après la connexion

Avec ceci modification, lorsqu'une panique survient dans la fonction handle, la fonction de récupération différée au sein de la même goroutine l'attrapera et la traitera en conséquence.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal