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") }()
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") }()
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") })
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!