Rumah >pembangunan bahagian belakang >Golang >Mengapakah `menangguhkan pemulihan()` Kadangkala Gagal Memulihkan Panik dalam Go?
Memahami Had defer recover()
Dalam Go, menggunakan corak defer recover() boleh menangkap panik dan menghalang penamatan program. Walau bagaimanapun, seperti yang ditunjukkan dalam contoh, panggilan terus untuk menangguhkan recover() gagal pulih daripada panik. Tingkah laku ini bergantung pada pelaksanaan khusus recover().
Menurut dokumentasi rasmi, recover() hanya menyekat panik jika dipanggil dalam fungsi tertunda. Apabila dipanggil terus, ia gagal menghalang penamatan program. Perbezaan ini berpunca daripada fakta bahawa fungsi tertunda, dalam kes defer recover(), ialah recover() panggilan itu sendiri.
Untuk menggambarkan ini, pertimbangkan contoh berikut:
package main func main() { defer func() { recover() }() // Recoverable panic panic("panic") }
Dalam senario ini, fungsi tanpa nama berfungsi sebagai fungsi tertunda, dan panggilan recover() di dalamnya berjaya menangkap panik.
Walau bagaimanapun, dalam kod berikut:
package main func main() { defer recover() // Direct call to recover() panic("panic") }
recover() dipanggil terus sebagai fungsi tertunda, menyebabkan program panik dan bukannya pulih.
Variasi Menarik
Variasi yang menarik untuk dipertimbangkan ialah kod berikut, yang tidak panik:
package main func main() { var recover = func() { recover() } // Function type variable defer recover() panic("panic") }
Dalam contoh ini, kami menetapkan fungsi tanpa nama kepada pembolehubah bernama pulih. Fungsi ini memanggil fungsi recover() terbina dalam. Fungsi tertunda kemudian ditetapkan untuk memanggil nilai pembolehubah pulih, dengan berkesan memanggil recover(). Akibatnya, panik terperangkap dan program meneruskan pelaksanaan.
Atas ialah kandungan terperinci Mengapakah `menangguhkan pemulihan()` Kadangkala Gagal Memulihkan Panik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!