Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah boleh panik dalam fungsi penangguhan, terutamanya apabila ia sudah panik?

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

WBOY
WBOYke hadapan
2024-02-11 20:33:08972semak imbas

在 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()
}

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)
}

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)
}()

Output (cuba di Go Playground):

Checkpoint 2
Checkpoint 1
panic: 999 [recovered]
    panic: 2 [recovered]
    panic: 1
...

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam