Подтвердить что ты не робот

Повторить попытку после исключения в Groovy

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

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

Есть ли что-то подобное в Groovy/Java?

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

>

Ответ 3

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