Rumah >pembangunan bahagian belakang >Golang >Tangguhkan `recover()` lwn. `defer func() { recover() }()`: Mengapa Seseorang Memulihkan Panik dan Yang Lain Tidak?

Tangguhkan `recover()` lwn. `defer func() { recover() }()`: Mengapa Seseorang Memulihkan Panik dan Yang Lain Tidak?

DDD
DDDasal
2024-11-29 11:27:101038semak imbas

Defer `recover()` vs. `defer func() { recover() }()`: Why Does One Recover Panics and the Other Doesn't?

tunda pulih() lwn. defer func() { recover() }()

S: Mengapa panggilan untuk menangguhkan berfungsi () { recover() }() berjaya memulihkan goroutine yang panik, manakala panggilan untuk menangguhkan recover() tidak bukan?

J: Seperti yang dinyatakan dalam dokumentasi rasmi untuk recover():

"Jika recover dipanggil di luar fungsi tertunda, ia tidak akan menghentikan urutan panik."

Dalam kes defer recover(), recover() ialah fungsi tertunda itu sendiri. Apabila dilaksanakan, recover() tidak memanggil dirinya sendiri. Oleh itu, ia gagal menghentikan urutan panik.

Jika recover() boleh memanggil dirinya sendiri, ia akan menghentikan panik. Walau bagaimanapun, senario ini tidak boleh dilaksanakan.

Pertimbangan Tambahan:

Kod berikut juga mengelakkan panik:

package main

func main() {
    var recover = func() { recover() }
    defer recover()
    panic("panic")
}

Dalam kes ini, a pembolehubah bernama recover of function type dicipta untuk menyimpan fungsi tanpa nama yang memanggil fungsi recover() terbina dalam. Fungsi tertunda kemudian ditetapkan untuk memanggil nilai pembolehubah pulih. Ini berjaya menghentikan urutan panik dengan menggunakan fungsi recover() secara tidak langsung.

Atas ialah kandungan terperinci Tangguhkan `recover()` lwn. `defer func() { recover() }()`: Mengapa Seseorang Memulihkan Panik dan Yang Lain Tidak?. 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