Golang 如何处理WaitGroups的错误
在运行多个 goroutine 时,我们有可能得到一些 panic 。 为了处理这种情况,我们可以使用 通道 和 Waitgroups 的组合来成功处理错误,而不是退出进程。
我们假设有一个函数,当被调用时返回一个 panic ,这将自动杀死程序的执行,因为当 panic 被调用时,它在内部调用 os.Exit() 函数。我们要确保这个恐慌不会关闭程序,为此,我们将创建一个通道来存储错误,然后我们就可以在 选择 语句的帮助下使用这个通道来打印错误。
下面显示的代码的主要思想是–
- 创建两个通道,一个用来存放错误,另一个用来表示 WaitGroup。
-
一个 goroutine ,用来等待WaitGroup完成,也用来在完成后关闭通道。
-
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
应该注意的是,你的机器的输出可能有所不同,但可以肯定的是,你会遇到这个错误信息。
极客教程