
errorgroup处理子协程panic问题
当使用errorgroup管理子协程时,主协程可以使用errorgroup.wait()获取子协程返回的错误。然而,当子协程发生panic时,子协程的defer函数使用recover来防止程序终止,但无法返回错误,导致主协程的errorgroup.wait()获取到的错误为nil。
为了解决这个问题,我们可以修改子协程中defer函数中的命名返回值。具体做法如下:
package main
import (
"errors"
"fmt"
)
func test(num int) (err error) {
defer func() {
if x := recover(); x != nil {
err = errors.New(fmt.Sprintf("test defer: %s", x))
}
}()
if num == 1 {
panic("test panic")
}
return
}
func main() {
fmt.Println(test(0))
fmt.Println(test(1))
}在修改后的代码中,defer函数中的命名返回值err被用于存储panic信息。这样,当子协程发生panic时,recover会获取panic信息并修改err的值,使主协程在调用errorgroup.wait()时能够捕获到子协程的panic信息。










