Récupération de panique générique dans les programmes Go
Lorsque des routines concurrentes dans un programme Go rencontrent des erreurs critiques qui entraînent des paniques, il devient crucial de procéder gracieusement gérer et signaler ces exceptions à un service de reporting externe comme Sentry ou Raygun. Cependant, capturer les paniques des routines exécutées dans des goroutines distinctes pose un défi.
Le problème des paniques des goroutines
Une goroutine ne peut pas se remettre d'une panique qui se produit dans une autre goroutine. Cette limitation pose un problème pour capturer et signaler les paniques des routines simultanées.
Techniques de récupération idiomatiques
Pour récupérer des paniques dans les routines simultanées, il est nécessaire d'injecter du code dans le Fonction de goroutine qui vérifie les valeurs récupérées. La manière standard d'y parvenir consiste à utiliser une fonction différée qui appelle recovery().
go func() { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() panic("catch me") }()
Cette approche garantit que toute panique au sein de la goroutine sera détectée par la fonction différée et enregistrée en conséquence.
Fonction Wrapper pour une récupération simplifiée
Pour simplifier le processus de récupération, vous pouvez créer une fonction wrapper qui encapsule la logique de récupération :
func wrap(f func()) { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() f() }
Maintenant, vous pouvez utiliser la fonction wrap() pour protéger n'importe quelle fonction goroutine des paniques :
go wrap(func() { panic("catch me") })
Remarque :Le La fonction wrap() vous permet d'exécuter des fonctions arbitraires sans créer explicitement de nouvelles goroutines, tout en garantissant une récupération de panique.
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!