Rumah >pembangunan bahagian belakang >Golang >Tangguhkan `recover()` lwn. `defer func() { recover() }()`: Mengapa Seseorang Memulihkan Panik dan Yang Lain Tidak?
tunda pulih() lwn. defer func() { recover() }()
S: Mengapa panggilan untuk menangguhkan berfungsi () { recover() }() berjaya memulihkan goroutine yang panik, manakala panggilan untuk menangguhkan recover() tidak bukan?
J: Seperti yang dinyatakan dalam dokumentasi rasmi untuk recover():
"Jika recover dipanggil di luar fungsi tertunda, ia tidak akan menghentikan urutan panik."
Dalam kes defer recover(), recover() ialah fungsi tertunda itu sendiri. Apabila dilaksanakan, recover() tidak memanggil dirinya sendiri. Oleh itu, ia gagal menghentikan urutan panik.
Jika recover() boleh memanggil dirinya sendiri, ia akan menghentikan panik. Walau bagaimanapun, senario ini tidak boleh dilaksanakan.
Pertimbangan Tambahan:
Kod berikut juga mengelakkan panik:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
Dalam kes ini, a pembolehubah bernama recover of function type dicipta untuk menyimpan fungsi tanpa nama yang memanggil fungsi recover() terbina dalam. Fungsi tertunda kemudian ditetapkan untuk memanggil nilai pembolehubah pulih. Ini berjaya menghentikan urutan panik dengan menggunakan fungsi recover() secara tidak langsung.
Atas ialah kandungan terperinci Tangguhkan `recover()` lwn. `defer func() { recover() }()`: Mengapa Seseorang Memulihkan Panik dan Yang Lain Tidak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!