Rumah > pembangunan bahagian belakang > Golang > Mengapakah `tunda pulih()` Gagal Menangkap Panik, Manakala `tunda func() { recover() }()` Berjaya?

Mengapakah `tunda pulih()` Gagal Menangkap Panik, Manakala `tunda func() { recover() }()` Berjaya?

Susan Sarandon
Lepaskan: 2024-11-30 21:35:17
asal
882 orang telah melayarinya

Why Does `defer recover()` Fail to Catch Panics, While `defer func() { recover() }()` Succeeds?

Kenapa tangguh pulih() Tidak Tangkap Panik?

Persoalannya:

Mengapa panggilan untuk menangguhkan berfungsi( ) { recover() }() berjaya memulihkan goroutine yang panik, tetapi panggilan untuk menangguhkan recover() bukan?

Jawapannya:

Seperti dalam dokumentasi recover(), "Jika recover dipanggil di luar fungsi tertunda, ia akan tidak menghentikan urutan yang panik."

Dalam kes penangguhan pulih(), pulih() itu sendiri adalah fungsi tertunda. Oleh itu, ia tidak memanggil dirinya sendiri, membawa kepada urutan panik yang berterusan.

Jika recover() memanggil dirinya sebagai fungsi tertunda, ia akan menghentikan urutan panik. Walau bagaimanapun, ini adalah tidak logik.

Varian Menarik:

Kod berikut juga mengelakkan panik:

package main

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

Di sini, kami mencipta pembolehubah pulih dengan nilai fungsi yang memanggil fungsi recover() terbina dalam. Dengan menangguhkan panggilan kepada nilai pembolehubah ini, kami menggunakan recover() terbina dalam, yang kemudiannya menghentikan urutan panik.

Atas ialah kandungan terperinci Mengapakah `tunda pulih()` Gagal Menangkap Panik, Manakala `tunda func() { recover() }()` Berjaya?. 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