首页 > 后端开发 > Golang > 如何处理单独的 Go 例程中的恐慌?

如何处理单独的 Go 例程中的恐慌?

DDD
发布: 2024-11-07 20:36:02
原创
437 人浏览过

How to Handle Panics in Separate Go Routines?

处理 Go 例程中的恐慌

当 Go 例程中发生恐慌时,正确处理它是至关重要的。使用recover函数可以有效地检索panic值并进行相应的处理。

一种常见的方法是使用延迟函数在主函数中处理panic。然而,当panic发生在单独的goroutine中时,这种方法无法捕获它。

在给出的示例中:

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

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

    fmt.Println(*a)
    done <- *a
}
登录后复制

panic发生在goroutine内的handle函数中,但是主函数中的延迟恢复函数无法捕获它。这是因为恢复仅在发生恐慌的同一 goroutine 中调用时才有效。

要解决此问题,请将延迟的恢复函数调用移到句柄函数中:

func main() {
    done := make(chan int64)
    defer fmt.Println("Graceful End of program")

    go handle(done)
    for {
        select {
        case <-done:
            return
        }
    }
}

func handle(done chan int64) {
    defer func() {
        r := recover()
        if _, ok := r.(error); ok {
            fmt.Println("Recovered")
        }
    }()

    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}
登录后复制

使用此修改后,当handle函数中出现panic时,同一个goroutine中的延迟恢复函数将捕获并相应地处理它。

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板