如何在Go语言中处理WaitGroup中的错误?
运行多个goroutine时,可能会出现一些panic。为了处理这种情况,我们可以结合使用channel和WaitGroup来成功处理错误,并避免程序退出。
假设有一个函数在调用时会返回一个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
需要注意的是,您的机器上的输出可能会有所不同,但肯定会出现错误消息。
广告