我有一个代码正在执行很长的 ETL 操作。有时网络问题。我想捕获错误read tcp 10.10.10.10:32423 -> 20.20.20.20:2344: i/o timeout
并重试该操作。
这是我的代码:
for {
err := mssql.Db.ProcessAllData(true, &processedAsutpIds, filename)
if err == nil {
fmt.Println("done.")
os.Exit(0)
} else {
fmt.Println(err.Error())
fmt.Println("!!!! Error occurred - sleep for 5 minutes")
time.Sleep(time.Minute * 5)
}
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以更惯用的方式重写它?
Von*_*onC 13
您可以考虑使用重试函数,例如Alexandre Bourget在“我最喜欢的 #golang 重试函数”中描述的函数:
var signedContent []byte
err := retry(5, 2*time.Second, func() (err error) {
signedContent, err = signFile(unsignedFile, contents)
return
})
if err != nil {
log.Println(err)
http.Error(w, err.Error(), 500)
return
}
Run Code Online (Sandbox Code Playgroud)
重试功能为:
func retry(attempts int, sleep time.Duration, f func() error) (err error) {
for i := 0; ; i++ {
err = f()
if err == nil {
return
}
if i >= (attempts - 1) {
break
}
time.Sleep(sleep)
log.Println("retrying after error:", err)
}
return fmt.Errorf("after %d attempts, last error: %s", attempts, err)
}
Run Code Online (Sandbox Code Playgroud)