Persoalannya:
Mengapa panggilan untuk menangguhkan berfungsi( ) { recover() }() berjaya memulihkan goroutine yang panik, tetapi panggilan untuk menangguhkan recover() bukan?
Jawapannya:
Seperti dalam dokumentasi recover(), "Jika recover dipanggil di luar fungsi tertunda, ia akan tidak menghentikan urutan yang panik."
Dalam kes penangguhan pulih(), pulih() itu sendiri adalah fungsi tertunda. Oleh itu, ia tidak memanggil dirinya sendiri, membawa kepada urutan panik yang berterusan.
Jika recover() memanggil dirinya sebagai fungsi tertunda, ia akan menghentikan urutan panik. Walau bagaimanapun, ini adalah tidak logik.
Varian Menarik:
Kod berikut juga mengelakkan panik:
package main func main() { var recover = func() { recover() } defer recover() panic("panic") }
Di sini, kami mencipta pembolehubah pulih dengan nilai fungsi yang memanggil fungsi recover() terbina dalam. Dengan menangguhkan panggilan kepada nilai pembolehubah ini, kami menggunakan recover() terbina dalam, yang kemudiannya menghentikan urutan panik.
Atas ialah kandungan terperinci Mengapakah `tunda pulih()` Gagal Menangkap Panik, Manakala `tunda func() { recover() }()` Berjaya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!