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

Susan Sarandon
Release: 2024-11-23 04:24:16
Original
985 people have browsed it

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

Understanding recover() Limitations in Nested Deferred Functions

In Golang, panic and recover provide mechanisms for error handling and recovery. While recover() helps handle panics by returning the panic value, its behavior changes within nested deferred functions.

Example 1: Simple Deferred Function

Consider the following code snippet:

package main

import "fmt"

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

func main() {
    defer printRecover()

    panic("OMG!") // Recoverable panic
}
Copy after login

This code panics with "OMG!" and successfully recovers the panic value using the deferred printRecover() function, as evidenced by the output:

Recovered: OMG!
Copy after login

Example 2: Nested Deferred Function

Now, let's wrap printRecover() in another deferred function:

package main

import "fmt"

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

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

    panic("OMG!") // Panic goes unrecoverable
}
Copy after login

In this example, the panic goes unrecoverable, and the program panics with the message:

Recovered: <nil>
panic: OMG!

goroutine 1 [running]:
main.main()
    /tmp/sandbox898315096/main.go:15 +0x60
Copy after login

Understanding the Difference

The difference between these two examples lies in the way recover() is called. According to the Golang specification:

  • recover() returns nil if not called directly by a deferred function.

In Example 1, printRecover() is directly called by a deferred function, which allows it to return the panic value. However, in Example 2, printRecover() is called by an anonymous function that is then deferred. This causes recover() to return nil because it is not directly called by a deferred function.

Therefore, to successfully recover a panic within a nested deferred function, recover() must be called directly from a deferred function.

The above is the detailed content of How Does `recover()` Behavior Differ in Nested vs. Non-Nested Deferred Functions in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template