首页  >  文章  >  后端开发  >  如何从 Go 例程中的恐慌中恢复?

如何从 Go 例程中的恐慌中恢复?

DDD
DDD原创
2024-11-07 13:51:03119浏览

How Can I Recover from Panics in Go Routines?

从 Go 例程中的 Panics 中恢复

Go 例程提供了强大的并发机制,可以并行执行独立任务。然而,处理 Go 例程中的恐慌可能会带来挑战。

了解 Go 例程中的恢复

recover 函数允许从函数范围内发生的恐慌中恢复。然而,它的有效性仅限于发生恐慌的同一个 goroutine。尝试从其他 goroutine 中的恐慌中恢复将会失败。

代码示例:失败的恐慌恢复

下面的代码片段演示了从恐慌中恢复失败的代码片段goroutine:

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
}

这段代码无法从handle goroutine中的panic中恢复,因为recover必须在引发panic的同一个goroutine中调用。

代码示例:成功的恐慌恢复

要成功从 goroutine 中的恐慌中恢复,必须在麻烦的 goroutine 中添加 defer receive 语句。下面是早期代码的修改版本,可以按预期工作:

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

在此示例中,延迟的恢复语句允许 goroutine 优雅地处理恐慌并记录恢复消息。

底层机制

根据 Go 文档,仅当当前 goroutine 中的所有延迟函数都已执行时才会发生紧急终止。因此,要从 Go 例程中的恐慌中恢复,必须在引发恐慌的同一个 Goroutine 中调用恢复,通常是通过延迟函数。

以上是如何从 Go 例程中的恐慌中恢复?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn