Go-异常重试


文章目录

  • 代码实现
  • 测试示例

由网络、程序等引发的异常,正确的做法是让它重试几次 :
代码实现
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

    推荐阅读