gpt4 book ai didi

go - 调用者如何从子 goroutine panic 中恢复

转载 作者:IT王子 更新时间:2023-10-29 01:26:21 24 4
gpt4 key购买 nike

我曾经认为,如果调用者在 panic 之前完成,goroutine 中的 panic 会杀死程序(延迟恢复没有帮助,因为此时还没有 panic 发生),

直到我尝试了以下代码:



func fun1() {
fmt.Println("fun1 started")
defer func() {
if err := recover(); err != nil {
fmt.Println("recover in func1")
}
}()

go fun2()

time.Sleep(10 * time.Second) // wait for the boom!
fmt.Println("fun1 ended")
}

func fun2() {
fmt.Println("fun2 started")

time.Sleep(5 * time.Second)
panic("fun2 booom!")

fmt.Println("fun2 ended")
}

我发现无论调用者函数是否完成,如果它启动的 goroutines panic,调用者的延迟恢复机制将无济于事。整个程序还是死了。

那么,为什么?理论上调用函数仍在运行。当 panic 发生时,调用者的延迟函数应该起作用(包括恢复)。

最佳答案

specification says :

While executing a function F, an explicit call to panic or a run-time panic terminates the execution of F. Any functions deferred by F are then executed as usual. Next, any deferred functions run by F's caller are run, and so on up to any deferred by the top-level function in the executing goroutine. At that point, the program is terminated and the error condition is reported, including the value of the argument to panic. This termination sequence is called panicking.

因为 fun2 是在 goroutine 中执行的顶层函数并且 fun2 不会从 panic 中恢复,当 fun2 时程序终止 panic 。

当执行 fun2 的 goroutine 出现 panic 时,不会调用 fun1 中的延迟调用。

一个 goroutine 无法从另一个 goroutine 的 panic 中恢复。

关于go - 调用者如何从子 goroutine panic 中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47808360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com