В Ruby я могу написать:
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
Есть ли что-то подобное в Groovy/Java?
Я нашел этот, но может быть, что-то лучше?
В Ruby я могу написать:
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
Есть ли что-то подобное в Groovy/Java?
Я нашел этот, но может быть, что-то лучше?
Вы можете создать свой собственный вспомогательный метод в 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()
}
В эти дни люди посоветуют вам использовать ScheduledExecutorService для реализации такой функции try-catch-retry, как Thread.sleep()
считается устаревшим и потенциально вредным для производительности. Я собирался указать вам на хороший ответ на этот вопрос, но не могу, чтобы жизнь меня находила. Я уточню свой ответ, если смогу его выкопать.
РЕДАКТИРОВАТЬ: нашел это: Как запросить функцию запроса через определенное время Надеюсь, это поможет вам.
>Я могу предложить эмулировать то же самое (я не уверен в семантике 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
}