在Groovy中的异常后重试

时间:2011-08-17 01:55:26

标签: java ruby exception groovy

在Ruby中,我可以写:

begin
  do_something # exception raised
rescue
   # handles error
   retry  # restart from beginning
end

Groovy / Java中有类似的东西吗?

我找到了this,但也许有更好的东西?

3 个答案:

答案 0 :(得分:17)

您可以在Groovy中构建自己的帮助器方法来封装此重试逻辑。

def retry(int times = 5, Closure errorHandler = {e-> log.warn(e.message,e)}
     , Closure body) {
  int retries = 0
  def exceptions = []
  while(retries++ < times) {
    try {
      return body.call()
    } catch(e) {
      exceptions << e
      errorHandler.call(e)
    }        
  }
  throw new MultipleFailureException("Failed after $times retries", exceptions)
}

(假设MultipleFailureException的定义类似于GPars' AsyncException

然后在代码中,您可以使用以下方法。

retry {
   errorProneOperation()
}

或者,具有不同数量的重试和错误处理行为:

retry(2, {e-> e.printStackTrace()}) {
  errorProneOperation()
}

答案 1 :(得分:1)

现在人们会建议您使用ScheduledExecutorService来实现这种try-catch-retry功能,因为Thread.sleep()被认为已过时且可能对性能有害。我打算用克拉图斯给你一个很好的答案,但不能为我的生活找到它。如果我能把它挖出来,我会更新我的答案。

编辑:找到它:How to retry function request after a certain time希望这对您有所帮助。

答案 2 :(得分:1)

我可以建议模仿有点相同(我不确定retry的语义):

def retry(handler, c) {
    try {
        c()
    } catch(e) {
        handler(e)
        retry(handler, c)  // restart from beginning
    }
}

def handler = {e ->
    // handles error
}

retry(handler) {
    do_something // exception raised
}