Rumah >pembangunan bahagian belakang >Golang >Mengapakah `menangguhkan pemulihan()` Kadangkala Gagal Memulihkan Panik dalam Go?

Mengapakah `menangguhkan pemulihan()` Kadangkala Gagal Memulihkan Panik dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-02 17:16:11243semak imbas

Why Does `defer recover()` Sometimes Fail to Recover Panics in Go?

Memahami Had defer recover()

Dalam Go, menggunakan corak defer recover() boleh menangkap panik dan menghalang penamatan program. Walau bagaimanapun, seperti yang ditunjukkan dalam contoh, panggilan terus untuk menangguhkan recover() gagal pulih daripada panik. Tingkah laku ini bergantung pada pelaksanaan khusus recover().

Menurut dokumentasi rasmi, recover() hanya menyekat panik jika dipanggil dalam fungsi tertunda. Apabila dipanggil terus, ia gagal menghalang penamatan program. Perbezaan ini berpunca daripada fakta bahawa fungsi tertunda, dalam kes defer recover(), ialah recover() panggilan itu sendiri.

Untuk menggambarkan ini, pertimbangkan contoh berikut:

package main

func main() {
    defer func() { recover() }() // Recoverable panic
    panic("panic")
}

Dalam senario ini, fungsi tanpa nama berfungsi sebagai fungsi tertunda, dan panggilan recover() di dalamnya berjaya menangkap panik.

Walau bagaimanapun, dalam kod berikut:

package main

func main() {
    defer recover() // Direct call to recover()
    panic("panic")
}

recover() dipanggil terus sebagai fungsi tertunda, menyebabkan program panik dan bukannya pulih.

Variasi Menarik

Variasi yang menarik untuk dipertimbangkan ialah kod berikut, yang tidak panik:

package main

func main() {
    var recover = func() { recover() } // Function type variable
    defer recover()
    panic("panic")
}

Dalam contoh ini, kami menetapkan fungsi tanpa nama kepada pembolehubah bernama pulih. Fungsi ini memanggil fungsi recover() terbina dalam. Fungsi tertunda kemudian ditetapkan untuk memanggil nilai pembolehubah pulih, dengan berkesan memanggil recover(). Akibatnya, panik terperangkap dan program meneruskan pelaksanaan.

Atas ialah kandungan terperinci Mengapakah `menangguhkan pemulihan()` Kadangkala Gagal Memulihkan Panik dalam Go?. 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