Go语言中 errorgroup 如何捕获子协程的 panic?
go语言中errorgroup中子协程发生panic通知主协程
在使用errorgroup来并发执行多个子协程时,主协程可以通过调用err := errorgroup.wait()来捕获子协程返回的error。然而,当子协程中发生panic时,情况变得复杂。
默认情况下,子协程中的panic会导致整个程序终止,而errorgroup无法捕捉到panic信息。为了解决此问题,需要在子协程中使用defer和recover机制来捕获panic,并将其转换为error。
具体做法是在子协程中,使用defer包裹住整个函数体,然后在defer中使用recover捕获panic。如果捕获到panic,可以使用recover返回的值创建并返回一个error,以便主协程在调用errorgroup.wait()时能够捕获到这个error。
立即学习“go语言免费学习笔记(深入)”;
以下示例展示了如何修改子协程来处理panic:
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 }
通过这种方式,当子协程发生panic时,主协程可以通过调用errorgroup.wait()来捕获到panic信息,从而避免程序意外终止。