Rumah >pembangunan bahagian belakang >Golang >Mengapa Tidak `menangguhkan pemulihan()` Tangkap Panik dalam Go?
Bilakah penangguhan pulih() Gagal Menangkap Panik?
Dalam Go, fungsi tangguh dilaksanakan mengikut tertib terbalik pengisytiharannya apabila fungsi kembali normal atau panik. Walaupun defer func() { recover() }() berkesan pulih daripada panik, perkara yang sama tidak benar untuk defer recover().
Tingkah laku ini berpunca daripada dokumentasi recover(), yang menyatakan bahawa "jika recover dipanggil di luar fungsi tertunda yang akan tidak menghentikan urutan panik." Dalam kes defer recover(), recover sendiri ialah fungsi tertunda, dan oleh itu tidak memanggil dirinya sendiri.
Contoh:
Pertimbangkan kod berikut:
package main func main() { defer recover() panic("panic") }
Kod ini sememangnya akan panik dengan mesej "panic: panic," yang menunjukkan bahawa defer recover() tidak menghalang panik.
Contoh Kerja:
Sebaliknya, kod berikut berjaya pulih daripada panik:
package main func main() { defer func() { recover() }() panic("panic") }
Dalam kes ini, tanpa nama fungsi dipanggil apabila fungsi utama kembali atau panik. Dalam fungsi tanpa nama ini, recover() dipanggil, berjaya menangkap dan mencegah panik.
Contoh Luar Biasa:
Menariknya, kod berikut juga mengelakkan panik:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
Di sini, pembolehubah fungsi pulih memegang rujukan kepada fungsi tanpa nama yang memanggil terbina dalam recover(). Menentukan pembolehubah ini sebagai fungsi tertunda dengan berkesan memanggil recover() terbina dalam, menghentikan panik.
Atas ialah kandungan terperinci Mengapa Tidak `menangguhkan pemulihan()` Tangkap Panik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!