Adakah boleh panik dalam fungsi penangguhan, terutamanya apabila ia sudah panik?

WBOY
Lepaskan: 2024-02-11 20:33:08
ke hadapan
953 orang telah melayarinya

在 defer 函数内部发生恐慌是否可以,特别是当它已经发生恐慌时?

Apabila panik berlaku di dalam fungsi penangguhan, adakah ia akan memberi kesan? Ini adalah soalan biasa, terutamanya jika situasi panik telah berlaku. Dalam PHP, fungsi tangguh digunakan untuk melakukan beberapa operasi pembersihan sebelum fungsi semasa kembali. Apabila panik berlaku, atur cara akan menghentikan pelaksanaan serta-merta, dan semua fungsi penangguhan akan dilaksanakan dalam urutan terakhir masuk dahulu. Oleh itu, walaupun selepas panik berlaku, fungsi tangguh masih akan dilaksanakan. Ini berguna untuk mengendalikan tugas seperti pelepasan sumber dan pengendalian ralat. Tidak kira apa yang berlaku, fungsi tangguh sentiasa dilaksanakan dengan pasti, memastikan integriti dan kestabilan kod.

Isi soalan

func sub(){
    defer func (){
        panic(2)
    }()
    panic(1)
}

func main(){
    defer func(){
        x:=recover()
        println(x.(int));
    }()
    sub()
}
Salin selepas log masuk

Saya mencuba kod ini dan nampaknya panik pertama panic(1) 被第二个恐慌 panic(2) "mengatasi".

Tetapi bolehkah melakukan ini? Atau memanggil fungsi Golang yang mungkin panik dalam fungsi penangguhan?

(Dalam C++, membuang pengecualian daripada pemusnah hampir tidak boleh diterima. Jika timbunan telah dibuka, ia akan menamatkan program. Saya tertanya-tanya jika panik dengan cara yang sama akan menjadi buruk di Golang.)

Kaedah Selesai

Ya , tak apa. Kepanikan yang disebabkan oleh fungsi kelewatan bukanlah keadaan istimewa yang baru, ia hanya bermakna urutan panik tidak akan berhenti.

Kod contoh anda juga membuktikan bahawa ia ok, malah panggilan "atas" panic() 称为可以通过对 recover() untuk menghentikan fungsi kelewatan.

Norma: Mengendalikan panik:

Satu perkara yang perlu diperhatikan di sini ialah walaupun anda memanggil panggilan panic(),所有其他延迟函数仍然会运行。另外,来自延迟函数的没有 recover()panic() 宁愿“包装”现有的恐慌,而不是“覆盖”它(尽管 recover() 调用确实只会返回传递给最后一次 panic() dalam fungsi tertunda).

Lihat contoh ini:

func main() {
    defer func() {
        fmt.Println("Checkpoint 1")
        panic(1)
    }()
    defer func() {
        fmt.Println("Checkpoint 2")
        panic(2)
    }()
    panic(999)
}
Salin selepas log masuk

Output (cuba di Go Playground):

c2e572c1c34a0369ef7​989373914f540

Walaupun semua fungsi tertunda dipanggil panic(),所有延迟函数都会执行,并且打印的最终恐慌序列包含传递给所有 panic() nilai panggilan.

Jika anda memanggil recover() dalam fungsi kelewatan, anda juga akan mendapat status atau mesej "dipulihkan" ini dalam cetakan akhir:

defer func() {
    recover()
    fmt.Println("Checkpoint 1")
    panic(1)
}()
defer func() {
    recover()
    fmt.Println("Checkpoint 2")
    panic(2)
}()
Salin selepas log masuk

Output (cuba di Go Playground):

Checkpoint 2
Checkpoint 1
panic: 999 [recovered]
    panic: 2 [recovered]
    panic: 1
...
Salin selepas log masuk

Atas ialah kandungan terperinci Adakah boleh panik dalam fungsi penangguhan, terutamanya apabila ia sudah panik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!