Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Gelagat `recover()` Berbeza dalam Fungsi Tertunda Bersarang vs. Tidak Bersarang dalam Go?

Bagaimanakah Gelagat `recover()` Berbeza dalam Fungsi Tertunda Bersarang vs. Tidak Bersarang dalam Go?

Susan Sarandon
Lepaskan: 2024-11-23 04:24:16
asal
1030 orang telah melayarinya

How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?

Memahami Pengehadan recover() dalam Fungsi Tertunda Bersarang

Di Golang, panik dan pulih menyediakan mekanisme untuk pengendalian dan pemulihan ralat. Walaupun recover() membantu mengendalikan panik dengan mengembalikan nilai panik, tingkah lakunya berubah dalam fungsi tertunda bersarang.

Contoh 1: Fungsi Tertunda Mudah

Pertimbangkan coretan kod berikut :

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer printRecover()

    panic("OMG!") // Recoverable panic
}
Salin selepas log masuk

Kod ini panik dengan "OMG!" dan berjaya memulihkan nilai panik menggunakan fungsi printRecover() tertunda, seperti yang dibuktikan oleh output:

Recovered: OMG!
Salin selepas log masuk

Contoh 2: Fungsi Tertunda Bersarang

Sekarang, mari kita bungkus printRecover() dalam fungsi tertunda lain:

package main

import "fmt"

func printRecover() {
    r := recover()
    fmt.Println("Recovered:", r)
}

func main() {
    defer func() {
        printRecover()
    }()

    panic("OMG!") // Panic goes unrecoverable
}
Salin selepas log masuk

Dalam ini contoh, panik tidak dapat dipulihkan, dan program panik dengan mesej:

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
Salin selepas log masuk

Memahami Perbezaan

Perbezaan antara kedua-dua contoh ini terletak pada cara memulihkan () dipanggil. Menurut spesifikasi Golang:

  • recover() mengembalikan sifar jika tidak dipanggil terus oleh fungsi tertunda.

Dalam Contoh 1, printRecover() dipanggil terus oleh fungsi tertunda, yang membolehkan ia mengembalikan nilai panik. Walau bagaimanapun, dalam Contoh 2, printRecover() dipanggil oleh fungsi tanpa nama yang kemudiannya ditangguhkan. Ini menyebabkan recover() mengembalikan sifar kerana ia tidak dipanggil secara langsung oleh fungsi tertunda.

Oleh itu, untuk berjaya memulihkan panik dalam fungsi tertunda bersarang, recover() mesti dipanggil terus daripada fungsi tertunda.

Atas ialah kandungan terperinci Bagaimanakah Gelagat `recover()` Berbeza dalam Fungsi Tertunda Bersarang vs. Tidak Bersarang 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