Stacktraces von Panics abrufen und speichern
Panics in Go geben standardmäßig einen Stacktrace an die Standardausgabe aus und liefern so wertvolle Debugging-Informationen. Bei der Wiederherstellung nach einer Panik mit „recover()“ wird jedoch nur eine Fehlerbeschreibung zurückgegeben.
Gibt es eine Möglichkeit, den während einer Panik erstellten Stacktrace abzurufen und zu speichern, um den genauen Ort des Problems leichter zu identifizieren?
Verwendung des Runtime/Debug-Pakets
Die Antwort liegt im Runtime/Debug-Paket. Dieses Paket bietet einen Mechanismus zum Zugriff und Speichern des mit einer Panik verbundenen Stacktrace. So geht's:
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) }
Dieser Code definiert eine verzögerte Funktion, die etwaige Paniken behandelt. Wenn eine Panik auftritt, erfasst die Funktion „recover()“ den Fehler. Darüber hinaus wird die Funktion debug.Stack() verwendet, um den mit der Panik verbundenen Stacktrace abzurufen und ihn als Zeichenfolgenvariable zu speichern. Abschließend werden sowohl der Fehler als auch der Stacktrace zu Debugzwecken auf der Konsole ausgegeben.
Beim Ausführen dieses Codes wird Folgendes ausgegeben:
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
In dieser Ausgabe zeigt der Stacktrace die Zeile deutlich an im Code, der die Panik verursacht hat, und liefert wertvollere Debugging-Informationen als nur die Fehlerbeschreibung.
Das obige ist der detaillierte Inhalt vonWie kann ich den Stacktrace einer Go-Panik für eine detailliertere Fehlerbehebung abrufen und speichern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!