Повторите после исключения в Groovy - PullRequest
13 голосов
/ 17 августа 2011

В Ruby я могу написать:

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

Есть ли что-то похожее в Groovy / Java?

Я нашел это но может быть есть что-то лучше?

Ответы [ 3 ]

17 голосов
/ 17 августа 2011

Вы можете создать свой собственный вспомогательный метод в 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 аналогично AsyncException GPars )

тогда в коде вы можете использовать этот метод следующим образом.

retry {
   errorProneOperation()
}

или с другим количеством повторных попыток и поведением обработки ошибок:

retry(2, {e-> e.printStackTrace()}) {
  errorProneOperation()
}
1 голос
/ 17 августа 2011

Я могу предложить подражать так же (я не уверен насчет семантики 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
}
1 голос
/ 17 августа 2011

В наши дни люди будут советовать вам использовать ScheduledExecutorService для реализации такого рода функций try-catch-retry, так как Thread.sleep() считается устаревшим и потенциально плохим для производительности.Я собирался указать вам хороший ответ на этот вопрос Клетусом, но не смог найти его.Я обновлю свой ответ, если смогу выкопать его.

РЕДАКТИРОВАТЬ: нашел его: Как повторить запрос функции через определенное время Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...