Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah Fungsi Pemanggil Pulih daripada Panik Goroutine Kanak-kanak?

Bolehkah Fungsi Pemanggil Pulih daripada Panik Goroutine Kanak-kanak?

Susan Sarandon
Susan Sarandonasal
2024-11-04 08:21:30703semak imbas

Can a Caller Function Recover from a Child Goroutine Panic?

Pemulihan Fungsi Pemanggil daripada Child Goroutine Panic

Bertentangan dengan kepercayaan popular, panik goroutine tidak semestinya menamatkan keseluruhan program. Salah tanggapan ini berpunca daripada andaian bahawa fungsi pemulihan tertunda dalam pemanggil akan menangani panik. Walau bagaimanapun, ini tidak berlaku jika pemanggil selesai sebelum panik berlaku dalam goroutine.

Pertimbangkan contoh berikut:

<code class="go">func fun1() {
    fmt.Println("fun1 started")
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recover in func1")
        }
    }()

    go fun2()

    time.Sleep(10 * time.Second) // wait for the boom!
    fmt.Println("fun1 ended")
}

func fun2() {
    fmt.Println("fun2 started")

    time.Sleep(5 * time.Second)
    panic("fun2 booom!")

    fmt.Println("fun2 ended")
}</code>

Walaupun fungsi pemanggil (fun1) menyelesaikan pelaksanaan, program masih ditamatkan jika fun2 panik. Ini berlaku kerana spesifikasi Go mentakrifkan bahawa apabila panik berlaku dalam goroutine:

  • Pelaksanaan goroutine itu ditamatkan.
  • Fungsi tertunda yang dipanggil oleh goroutine itu dilaksanakan.
  • Fungsi tertunda pemanggilnya dilaksanakan.

Dalam kes ini, fun2 ialah fungsi peringkat teratas dalam goroutine, dan ia tidak pulih daripada panik. Oleh itu, program ini ditamatkan.

Perkara utama ialah:

Groutine tidak dapat pulih daripada panik yang berlaku dalam goroutine lain.

Atas ialah kandungan terperinci Bolehkah Fungsi Pemanggil Pulih daripada Panik Goroutine Kanak-kanak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn