Mengambil dan Menyimpan Susun Tindanan Panik
Panik dalam Go, secara lalai, mengeluarkan surih tindanan kepada output standard, memberikan maklumat penyahpepijatan yang berharga. Walau bagaimanapun, pemulihan daripada panik menggunakan recover() hanya mengembalikan perihalan ralat.
Adakah terdapat cara untuk mendapatkan dan menyimpan surih tindanan yang dihasilkan semasa panik, menjadikannya lebih mudah untuk mengenal pasti lokasi sebenar isu?
Menggunakan Pakej runtime/debug
Jawapannya terletak pada runtime/debug pakej. Pakej ini menyediakan mekanisme untuk mengakses dan menyimpan surih tindanan yang dikaitkan dengan panik. Begini caranya:
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) }
Kod ini mentakrifkan fungsi tertunda yang mengendalikan sebarang panik. Apabila panik berlaku, fungsi recover() menangkap ralat. Selain itu, fungsi debug.Stack() digunakan untuk mendapatkan surih tindanan yang dikaitkan dengan panik dan menyimpannya sebagai pembolehubah rentetan. Akhir sekali, kedua-dua ralat dan surih tindanan dicetak ke konsol untuk tujuan penyahpepijatan.
Menjalankan kod ini akan mengeluarkan yang berikut:
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
Dalam output ini, surih tindanan dengan jelas menunjukkan garisan dalam kod yang menyebabkan panik, memberikan maklumat penyahpepijatan yang lebih berharga daripada hanya penerangan ralat.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mendapatkan semula dan menyimpan surih tindanan panik Go untuk penyahpepijatan yang lebih terperinci?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!