Pemulihan Panik Generik dalam Program Go
Apabila bekerja dengan rutin Go, mungkin terdapat keadaan di mana anda ingin menangkap dan mengendalikan ranap atau panik yang berlaku di dalamnya, berpotensi untuk melaporkan kepada pelayan pelaporan ralat seperti Sentry atau Raygun. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa goroutine tidak boleh pulih daripada panik dalam goroutine lain.
Pendekatan Idiomatik
Cara idiomatik untuk menangani perkara ini adalah dengan memasukkan kod ke dalam fungsi yang dilancarkan sebagai goroutine. Ini melibatkan penggunaan fungsi tertunda yang memanggil recover(), yang menyediakan keupayaan untuk pulih daripada keadaan panik.
Pertimbangkan contoh berikut:
go func() { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() panic("catch me") }()
Kod ini akan mengeluarkan panik yang berkaitan mesej apabila dilaksanakan.
Walaupun tidak praktikal untuk melaksanakan pendekatan ini dalam setiap goroutine yang anda lancarkan, anda boleh mudahkan proses dengan mentakrifkan fungsi bernama yang merangkumi fungsi pemulihan dan panggil fungsi itu dalam goroutine anda (dengan panggilan tertunda).
func logger() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }
Dengan memanggil fungsi ini dalam penutupan tertunda, anda boleh mengendalikan panik situasi dengan ringkas.
go func() { defer logger() panic("catch me") }()
Pembungkus Fungsi
Untuk kemudahan yang lebih baik, anda boleh mencipta fungsi pembungkus yang mengambil fungsi sebenar sebagai input dan menguruskan proses pemulihan panik. Fungsi pembalut ini boleh digunakan seperti berikut:
func wrap(f func()) { defer func() { if r := recover(); r != nil { fmt.Println("Caught:", r) } }() f() }
Menggunakan pembalut ini memudahkan lagi proses pengendalian panik:
go wrap(func() { panic("catch me") })
Pertimbangan Tambahan
Kod contoh yang disediakan menunjukkan situasi di mana goroutine dilancarkan dalam fungsi wrap(). Ini membolehkan pemanggil menentukan sama ada goroutine baharu diperlukan dengan mendahului panggilan wrap() dengan kata kunci pergi. Walau bagaimanapun, fungsi wrap() juga boleh digunakan untuk melindungi pelaksanaan fungsi arbitrari yang diluluskan sebagai input, walaupun anda tidak mahu menjalankannya serentak dalam goroutine baharu.
Atas ialah kandungan terperinci Bagaimana Saya Boleh Pulih daripada Panik dalam Go Goroutines?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!