go语言使用errorgroup当子协程发生panic怎么通知主协程?

wangguan1024
  • 5
山东新手上路,请多包涵

errorgroup主协程能通过err := errorGroup.Wait()能够对于子协程中return出的error进行捕获。

当子协程发生panic时,子协程的defer使用recover防止程序终止,但是defer函数又无法return一个error,主协程的err := errorGroup.Wait()err为nil。

子协程该怎么告知主协程,使得主协程能够捕获到子协程的panic信息?

回复
阅读 583
1 个回答
✓ 已被采纳

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))
}

$ go run ./hello.go 
<nil>
test defer: test panic
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏