How Can I Recover from Panics in Go Routines?

DDD
Release: 2024-11-07 13:51:03
Original
132 people have browsed it

How Can I Recover from Panics in Go Routines?

Recovering from Panics in Go Routines

Go routines offer a powerful mechanism for concurrency, enabling parallel execution of independent tasks. However, handling panics within go routines can pose challenges.

Understanding Recover in Go Routines

The recover function allows recovering from panics that occur within a function's scope. However, its effectiveness is limited to the same goroutine in which the panic arises. Attempts to recover from panics in other goroutines will fail.

Code Example: Failed Panic Recovery

Here's a code snippet that demonstrates the failure to recover from a panic in a go routine:

func main() {
    // Note: the following code will panic
    go handle(make(chan int64))

    for {}
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
Copy after login

This code fails to recover from the panic in the handle goroutine because recover must be invoked within the same goroutine that initiated the panic.

Code Example: Successful Panic Recovery

To successfully recover from panics in go routines, a defer recover statement must be added within the troublesome goroutine. Here's a modified version of the earlier code that works as expected:

func main() {
    done := make(chan int64)

    go func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered")
            }
        }()

        var a *int64
        a = nil

        fmt.Println(*a)
        done <- *a
    }()

    for {}
}
Copy after login

In this example, the deferred recover statement allows the goroutine to gracefully handle the panic and log a recovery message.

Underlying Mechanism

As per the Go documentation, panic termination only occurs when all deferred functions in the current goroutine have executed. Therefore, to recover from panics in go routines, recover must be invoked within the same goroutine that initiated the panic, typically via a deferred function.

The above is the detailed content of How Can I Recover from Panics in Go Routines?. 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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!