Bolehkah Fungsi Pemanggil Pulih daripada Kepanikan Kanak-kanak Goroutine dalam Go?

Linda Hamilton
Lepaskan: 2024-10-28 18:10:02
asal
996 orang telah melayarinya

Can a Caller Function Recover from a Child Goroutine's Panic in Go?

Bagaimanakah Fungsi Pemanggil Pulih daripada Panik Child Goroutine?

Sebelum ini, diandaikan bahawa panik dalam goroutine akan menamatkan program jika pemanggilnya selesai sebelum panik berlaku. Walau bagaimanapun, percubaan dengan kod sampel mendedahkan sebaliknya.

Kod Contoh:

<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>
Salin selepas log masuk

Gelagat Tidak Dijangka:

Walaupun jangkaan bahawa mekanisme pemulihan fungsi pemanggil akan mengendalikan panik goroutine, keseluruhan program masih ditamatkan.

Penjelasan:

Spesifikasi Go menyatakan bahawa:

Apabila fun2 ialah fungsi peringkat atas yang dilaksanakan dalam goroutine dan fun2 tidak pulih daripada panik, program ditamatkan apabila fun2 panik.

Memandangkan fun2 ialah fungsi peringkat teratas dalam goroutinenya dan ia berfungsi tidak mengendalikan panik, program ditamatkan lebih awal.

Autonomi Goroutine:

Groutine tidak boleh pulih daripada panik dalam goroutine lain. Oleh itu, panggilan tertunda dalam fun1 tidak digunakan apabila fun2 panik.

Kesimpulan:

Fungsi pemanggil tidak boleh pulih daripada panik dalam goroutine yang dicipta melainkan goroutine secara jelas pulih daripada panik sebelum pemanggil program ditamatkan.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan