在Ruby中,我可以写:
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
Groovy / Java中有类似的东西吗?
我找到了this,但也许有更好的东西?
答案 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
}