如何在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
需要注意的是,您的机器上的输出可能会有所不同,但肯定会出现错误消息。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP