文章目录
- 代码实现
- 测试示例
由网络、程序等引发的异常,正确的做法是让它重试几次 :
代码实现
package goximport (
"log"
"time"
)func Retry(attempts int, sleep time.Duration, fn func() error) error {
if err := fn();
err != nil {
if s, ok := err.(stop);
ok {
return s.error
}
if attempts--;
attempts > 0 {
log.Printf("retry func error: %s. attemps #%d after %s\n", err.Error(), attempts, sleep)
time.Sleep(sleep)
return Retry(attempts, 2*sleep, fn)
}
return err
}
return nil
}type stop struct {
error
}func NoRetryError(err error) stop {
return stop{err}
}
最多重试attempts
次,如果调用fn
返回错误,等待sleep
的时间,而下次错误重试就需要等待两倍的时间了。还有一点是错误的类型,常规错误会重试,而stop类型的错误会中断重试
,这也提供了一种中断机制
。
测试示例
func TestRetry(t *testing.T) {
Retry(5, time.Second, foo)
fmt.Println("done")
}var n = 0
func foo() error {
n++
if n > 3 {
return NoRetryError(errors.New("中断重试"))
}
fmt.Println(time.Now().Second())
return errors.New("timeout error")
}
【Go-异常重试】引用:
https://github.com/mnhkahn/gogogo/blob/master/util/retry_util.go
推荐阅读
- Go语言之GRPC
- go语言深拷贝和浅拷贝
- 通过golang context实现请求超时控制和goroutine生命周期控制
- go protobuf 使用教程(windows环境下)
- 网络协议与网络编程|Go语言进行web开发(二) Go中的Socket编程
- go的gin框架使用(一)(Hello World)
- golang|Go语言入门——从一个简单例子入门
- go语言之脚本命令的使用
- Golang中的"继承"
- 2018|Base58编码解码Go实现