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
Susan Sarandonasal
2024-11-23 04:24:161059semak imbas

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
}

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

Recovered: OMG!

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
}

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

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!

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