如何在Go语言中处理WaitGroup中的错误?


运行多个goroutine时,可能会出现一些panic。为了处理这种情况,我们可以结合使用channelWaitGroup来成功处理错误,并避免程序退出。

假设有一个函数在调用时会返回一个panic,这将自动终止程序的执行,因为当调用panic时,它会在内部调用os.Exit()函数。我们希望确保此panic不会关闭程序,为此,我们将创建一个channel来存储错误,然后我们可以稍后使用select语句来打印错误。

下面代码的主要思想是:

  • 创建两个channel,一个用于保存错误,另一个用于表示WaitGroup

  • 一个goroutine,用于等待WaitGroup完成,并在完成时关闭channel。

  • 使用select语句监听错误或WaitGroup完成。

示例

请考虑以下代码。

package main
import (
   "errors"
   "log"
   "sync"
)
func main() {
   fatalErrorChannel := make(chan error)
   wgDone := make(chan bool)
   var wg sync.WaitGroup
   wg.Add(2)
   go func() {
      log.Println("First WaitGroup")
      wg.Done()
   }()
   go func() {
      log.Println("Second WaitGroup")
      err := returningError()
      if err != nil {
         fatalErrorChannel <- err
      }
      wg.Done()
   }()
   go func() {
      wg.Wait()
      close(wgDone)
   }()
   select {
      case <-wgDone:
         break
      case err := <-fatalErrorChannel:
         close(fatalErrorChannel)
         log.Fatal("Error encountered: ", err)
   }
   log.Println("Program worked!")
}
func returningError() error {
   return errors.New("Error on panic.com")
}

输出

运行此代码时,将产生以下输出:

2022/02/21 09:15:43 Second WaitGroup
2022/02/21 09:15:43 Error encountered: Error on panic.com
exit status 1

需要注意的是,您的机器上的输出可能会有所不同,但肯定会出现错误消息。

更新于:2022年2月22日

4K+ 浏览量

启动您的职业生涯

完成课程获得认证

开始
广告