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

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

DDD
DDD原创
2024-11-07 20:36:02367浏览

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中文网其他相关文章!

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