如何在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