Pertimbangkan kod Golang berikut:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer printRecover() panic("OMG!") }
Program mudah ini berjaya panik dan pulih dengan output berikut:
Recovered: OMG!
Walau bagaimanapun, mengubah suai kod untuk dibalut printRecover() dalam fungsi tertunda lain menghasilkan hasil yang berbeza:
package main import "fmt" func printRecover() { r := recover() fmt.Println("Recovered:", r) } func main() { defer func() { printRecover() }() panic("OMG!") }
Dalam kes ini, panik tidak dipulihkan, menyebabkan program ranap:
Recovered: <nil> panic: OMG! goroutine 1 [running]: main.main() /tmp/sandbox898315096/main.go:15 +0x60
Penjelasan untuk tingkah laku ini terletak pada cara recover() berfungsi di Golang. Mengikut spesifikasi bahasa:
The return value of recover is nil if any of the following conditions holds: - panic's argument was nil; - the goroutine is not panicking; - recover was not called directly by a deferred function.
Dalam contoh pertama, recover() dipanggil terus oleh fungsi tertunda, jadi ia berjaya mendapatkan semula hujah panik. Dalam contoh kedua, walau bagaimanapun, recover() tidak dipanggil secara langsung oleh fungsi tertunda, sebaliknya oleh fungsi yang dipanggil sendiri oleh fungsi tertunda. Akibatnya, recover() mengembalikan sifar, dan panik tidak dipulihkan.
Atas ialah kandungan terperinci Mengapa Tidak `recover()` Berfungsi dalam Fungsi Tertunda Bersarang dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!