Maison > développement back-end > Golang > Comment puis-je implémenter une récupération de panique générique dans les programmes simultanés Go ?

Comment puis-je implémenter une récupération de panique générique dans les programmes simultanés Go ?

Mary-Kate Olsen
Libérer: 2024-12-16 05:25:09
original
171 Les gens l'ont consulté

How Can I Implement Generic Panic Recovery in Go Concurrent Programs?

Récupération de panique générique dans les programmes Go

Dans Go, il est souvent nécessaire de gérer les paniques liées à l'exécution simultanée de goroutines. Cependant, une approche directe recovery() est limitée car elle ne peut gérer les paniques qu'au sein de la goroutine actuelle. Cet article explore les méthodes idiomatiques pour obtenir une récupération de panique générique à partir de goroutines arbitraires.

Récupération de panique différée

La manière idiomatique de se remettre d'une panique dans une goroutine est d'utiliser une récupération de panique différée. fonctions. Une fonction différée est exécutée lorsque la goroutine actuelle se termine, même si la sortie est provoquée par une panique. En incluant une fonction différée qui appelle recovery(), vous pouvez capturer la panique et la gérer avec élégance.

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

    panic("Go routine panic")
}()
Copier après la connexion

Injecter la fonctionnalité de récupération

Dans les cas où l'ajout d'un Si une fonction différée pour chaque goroutine lancée n'est pas pratique, vous pouvez créer une fonction nommée qui encapsule la logique de récupération et l'appeler depuis le goroutine.

func logger() {
    if r := recover(); r != nil {
        fmt.Println("Caught:", r)
    }
}

go func() {
    defer logger()
    panic("Panic in goroutine")
}()
Copier après la connexion

Utilisation d'une fonction Wrapper

Une approche simplifiée consiste à créer une fonction utilitaire qui encapsule d'autres fonctions et gère la récupération de panique. Cette fonction wrapper peut ensuite être transmise à toute fonction qui doit être sécurisée contre la panique.

func wrap(f func()) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Caught:", r)
        }
    }()

    f()
}

go wrap(func() {
    panic("Panic in wrapped function")
})
Copier après la connexion

Conclusion

En tirant parti des fonctions différées et des wrappers de fonctions, il est possible pour récupérer les paniques de goroutines arbitraires et les gérer avec élégance, garantissant ainsi la stabilité des programmes Go. N'oubliez pas de considérer la meilleure approche en fonction des besoins spécifiques de votre application.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal