Mengendalikan Panik dalam Rutin Pergi
Apabila panik berlaku dalam rutin Go, adalah penting untuk mengendalikannya dengan betul. Menggunakan fungsi pulih boleh mendapatkan semula nilai panik dengan berkesan dan mengendalikannya dengan sewajarnya.
Satu pendekatan biasa ialah mengendalikan panik dalam fungsi utama menggunakan fungsi tertunda. Walau bagaimanapun, apabila panik berlaku dalam goroutine yang berasingan, pendekatan ini gagal menangkapnya.
Dalam contoh yang diberikan:
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { var a *int64 a = nil fmt.Println(*a) done <- *a }
Panik berlaku dalam fungsi pemegang dalam goroutine, tetapi fungsi pulih tertunda dalam fungsi utama tidak boleh menangkapnya. Ini kerana recover hanya berfungsi apabila digunakan dalam goroutine yang sama tempat panik itu berasal.
Untuk menyelesaikan isu ini, alihkan panggilan fungsi pulih tertunda dalam fungsi pemegang:
func main() { done := make(chan int64) defer fmt.Println("Graceful End of program") go handle(done) for { select { case <-done: return } } } func handle(done chan int64) { defer func() { r := recover() if _, ok := r.(error); ok { fmt.Println("Recovered") } }() var a *int64 a = nil fmt.Println(*a) done <- *a }
Dengan ini pengubahsuaian, apabila panik timbul dalam fungsi pemegang, fungsi pemulihan tertunda dalam goroutine yang sama akan menangkap dan memprosesnya dengan sewajarnya.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Panik dalam Rutin Pergi Berasingan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!