의 예외 후에, 나는 쓸 수 있습니다 : 그루비/자바에서 비슷한 일이시도 루비에서 그루비
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
있습니까?
나는 this을 찾았지만 더 좋은 점이 있을까요?
의 예외 후에, 나는 쓸 수 있습니다 : 그루비/자바에서 비슷한 일이시도 루비에서 그루비
begin
do_something # exception raised
rescue
# handles error
retry # restart from beginning
end
있습니까?
나는 this을 찾았지만 더 좋은 점이 있을까요?
이 재시도 로직을 캡슐화하는 그루비에서 자신의 도우미 메서드를 만들 수있다.
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)
}
다음과 같이
다음 코드에서이 방법을 사용할 수 있습니다 (GPars' AsyncException 유사 MultipleFailureException의 정의를 가정).
retry {
errorProneOperation()
}
또는 시도 및 오류 처리 동작의 다른 번호 :
이제retry(2, {e-> e.printStackTrace()}) {
errorProneOperation()
}
명 당신이 Thread.sleep()
이 오래된 및 성능에 대한 잠재적으로 나쁜 것으로 간주되는 한, 시도 - 캐치 재시도 이런 종류의 기능을 구현하기 위해 ScheduledExecutorService를 사용하여 알려 드릴 것입니다 요즘. 나는 이것을 크 레투 스 (cletus)에 의해 좋은 대답으로 가리킬 예정 이었지만, 내 인생에서 그것을 찾을 수는 없다. 나는 그것을 파헤 치면 내 대답을 업데이트 할 것이다.
편집 : 발견 : How to retry function request after a certain time 잘하면이 도움이됩니다.
나는 (내가 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
}
은'IllegalStateException'는 예외 중 하나를 (첫 번째 마지막 하드는 말을?)로 사용한다면 그것의 원인, 당신이 볼 수 있듯이 ** 많은 ** 더 유용 할 것입니다. ** 그것이 실패한 이유는 무엇입니까? 프로덕션에서는 시도가 실패 할 때마다 스택 추적을 인쇄하지 않을 것입니다. 모든 재시도가 실패한 경우에만 알고 싶습니다. –
Joachim에게 감사의 말을 전합니다. 귀하의 제안에 개별 예외 사항을 추가했습니다. stacktrace를 원하지 않는 한, 그 점을 설명하기위한 것입니다. 마지막으로보고하기 위해 예외가 수집되기 때문에 아마도 errorHandler의 목적은'body.call()'이 재 시도되기 전에 필요한 모든 리소스를 재설정하는 것입니다.이 경우 기본 클로저는'{->} ' – winstaan74
나는 비슷한 것을 사용했다. 감사합니다 winstaan. –