Go-异常重试

文章目录

  • 代码实现
  • 测试示例

由网络、程序等引发的异常,正确的做法是让它重试几次 :

代码实现

package gox

import (
	"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")
}

引用:
https://github.com/mnhkahn/gogogo/blob/master/util/retry_util.go

你可能感兴趣的:(Go语言)