Memahami Pengehadan recover() dalam Fungsi Tertunda Bersarang
Di Golang, panik dan pulih menyediakan mekanisme untuk pengendalian dan pemulihan ralat. Walaupun recover() membantu mengendalikan panik dengan mengembalikan nilai panik, tingkah lakunya berubah dalam fungsi tertunda bersarang.
Contoh 1: Fungsi Tertunda Mudah
Pertimbangkan coretan kod berikut :
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") // Recoverable panic }
Kod ini panik dengan "OMG!" dan berjaya memulihkan nilai panik menggunakan fungsi printRecover() tertunda, seperti yang dibuktikan oleh output:
Recovered: OMG!
Contoh 2: Fungsi Tertunda Bersarang
Sekarang, mari kita bungkus printRecover() dalam fungsi tertunda lain:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer func() { printRecover() }() panic("OMG!") // Panic goes unrecoverable }
Dalam ini contoh, panik tidak dapat dipulihkan, dan program panik dengan mesej:
Recovered: <nil> panic: OMG! goroutine 1 [running]: main.main() /tmp/sandbox898315096/main.go:15 +0x60
Memahami Perbezaan
Perbezaan antara kedua-dua contoh ini terletak pada cara memulihkan () dipanggil. Menurut spesifikasi Golang:
Dalam Contoh 1, printRecover() dipanggil terus oleh fungsi tertunda, yang membolehkan ia mengembalikan nilai panik. Walau bagaimanapun, dalam Contoh 2, printRecover() dipanggil oleh fungsi tanpa nama yang kemudiannya ditangguhkan. Ini menyebabkan recover() mengembalikan sifar kerana ia tidak dipanggil secara langsung oleh fungsi tertunda.
Oleh itu, untuk berjaya memulihkan panik dalam fungsi tertunda bersarang, recover() mesti dipanggil terus daripada fungsi tertunda.
Atas ialah kandungan terperinci Bagaimanakah Gelagat `recover()` Berbeza dalam Fungsi Tertunda Bersarang vs. Tidak Bersarang dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!