Rumah > pembangunan bahagian belakang > Golang > Mengapa Tidak `menangguhkan pemulihan()` Tangkap Panik dalam Go?

Mengapa Tidak `menangguhkan pemulihan()` Tangkap Panik dalam Go?

Linda Hamilton
Lepaskan: 2024-12-05 02:08:09
asal
883 orang telah melayarinya

Why Doesn't `defer recover()` Catch Panics in Go?

Bilakah penangguhan pulih() Gagal Menangkap Panik?

Dalam Go, fungsi tangguh dilaksanakan mengikut tertib terbalik pengisytiharannya apabila fungsi kembali normal atau panik. Walaupun defer func() { recover() }() berkesan pulih daripada panik, perkara yang sama tidak benar untuk defer recover().

Tingkah laku ini berpunca daripada dokumentasi recover(), yang menyatakan bahawa "jika recover dipanggil di luar fungsi tertunda yang akan tidak menghentikan urutan panik." Dalam kes defer recover(), recover sendiri ialah fungsi tertunda, dan oleh itu tidak memanggil dirinya sendiri.

Contoh:

Pertimbangkan kod berikut:

package main

func main() {
    defer recover()
    panic("panic")
}
Salin selepas log masuk

Kod ini sememangnya akan panik dengan mesej "panic: panic," yang menunjukkan bahawa defer recover() tidak menghalang panik.

Contoh Kerja:

Sebaliknya, kod berikut berjaya pulih daripada panik:

package main

func main() {
    defer func() { recover() }()
    panic("panic")
}
Salin selepas log masuk

Dalam kes ini, tanpa nama fungsi dipanggil apabila fungsi utama kembali atau panik. Dalam fungsi tanpa nama ini, recover() dipanggil, berjaya menangkap dan mencegah panik.

Contoh Luar Biasa:

Menariknya, kod berikut juga mengelakkan panik:

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}
Salin selepas log masuk

Di sini, pembolehubah fungsi pulih memegang rujukan kepada fungsi tanpa nama yang memanggil terbina dalam recover(). Menentukan pembolehubah ini sebagai fungsi tertunda dengan berkesan memanggil recover() terbina dalam, menghentikan panik.

Atas ialah kandungan terperinci Mengapa Tidak `menangguhkan pemulihan()` Tangkap Panik 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