如何利用ErrorGroup捕获子协程Panic并通知主协程?

如何利用errorgroup捕获子协程panic并通知主协程?

errorgroup处理子协程panic通知主协程

errorgroup可以捕获子协程返回的错误,但当子协程发生panic时,主协程无法得知错误信息。这是因为:

  • 子协程中使用defer recover()防止程序终止,但无法返回错误。
  • 主协程通过errgroup.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))
}

这样,主协程可以通过errgroup.wait()获得子协程中的panic信息:

<nil>
test defer: test panic

以上就是如何利用ErrorGroup捕获子协程Panic并通知主协程?的详细内容,更多请关注其它相关文章!