如何编写重试功能?

时间:2018-01-25 10:16:04

标签: scala error-handling

假设我有一个函数foo:Int => Try[Int],我需要重试它。也就是说,我需要调用它,直到它最多Success次返回k

我正在写一个函数retry

def retry(k: retries)(fun: Int => Try[Int]): Try[Int] = ???

我希望retry返回Success最后 Failure。你会怎么写的?

1 个答案:

答案 0 :(得分:4)

这是我使用的那个,它在返回T的任何thunk上都是通用的:

@tailrec
final def withRetry[T](retries: Int)(fn: => T): Try[T] = {
  Try(fn) match {
    case x: Success[T] => x
    case _ if retries > 1 => withRetry(retries - 1)(fn)
    case f => f
  }
}