Récupération et stockage des traces de pile de Panics
Panics in Go, par défaut, génère une trace de pile sur la sortie standard, fournissant des informations de débogage précieuses. Cependant, la récupération après une panique à l'aide de recovery() renvoie uniquement une description de l'erreur.
Existe-t-il un moyen de récupérer et de stocker la trace de pile produite lors d'une panique, facilitant ainsi l'identification de l'emplacement exact du problème ?
Utilisation du package runtime/debug
La réponse réside dans le package runtime/debug. Ce package fournit un mécanisme pour accéder et stocker la trace de pile associée à une panique. Voici comment :
package main import ( "fmt" "runtime/debug" ) func main() { defer func() { if r := recover(); r != nil { fmt.Println("Panic detected:", r) stacktrace := debug.Stack() fmt.Println("Stacktrace:", string(stacktrace)) } }() // Trigger a panic var mySlice []int j := mySlice[0] // Index out of bounds panic fmt.Printf("Hello, playground %d", j) }
Ce code définit une fonction différée qui gère les éventuelles paniques. Lorsqu'une panique se produit, la fonction recovery() capture l'erreur. De plus, la fonction debug.Stack() est utilisée pour récupérer la trace de pile associée à la panique et la stocker en tant que variable de chaîne. Enfin, l'erreur et le stacktrace sont imprimés sur la console à des fins de débogage.
L'exécution de ce code affichera ce qui suit :
Panic detected: runtime error: index out of range Stacktrace: goroutine 1 [running]: main.main.func1() /tmp/sandbox773777618/main.go:11 +0x60 panic(0xf9e00, 0x2078e0) /usr/local/go/src/runtime/panic.go:502 +0x2c0 main.main() /tmp/sandbox773777618/main.go:17 +0x60
Dans cette sortie, le stacktrace montre clairement la ligne dans le code qui a provoqué la panique, fournissant des informations de débogage plus précieuses que la simple description de l'erreur.
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!