2011-08-17 2 views
12

의 예외 후에, 나는 쓸 수 있습니다 : 그루비/자바에서 비슷한 일이시도 루비에서 그루비

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

있습니까?

나는 this을 찾았지만 더 좋은 점이 있을까요?

답변

12

이 재시도 로직을 캡슐화하는 그루비에서 자신의 도우미 메서드를 만들 수있다.

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() 
} 
+1

은'IllegalStateException'는 예외 중 하나를 (첫 번째 마지막 하드는 말을?)로 사용한다면 그것의 원인, 당신이 볼 수 있듯이 ** 많은 ** 더 유용 할 것입니다. ** 그것이 실패한 이유는 무엇입니까? 프로덕션에서는 시도가 실패 할 때마다 스택 추적을 인쇄하지 않을 것입니다. 모든 재시도가 실패한 경우에만 알고 싶습니다. –

+0

Joachim에게 감사의 말을 전합니다. 귀하의 제안에 개별 예외 사항을 추가했습니다. stacktrace를 원하지 않는 한, 그 점을 설명하기위한 것입니다. 마지막으로보고하기 위해 예외가 수집되기 때문에 아마도 errorHandler의 목적은'body.call()'이 재 시도되기 전에 필요한 모든 리소스를 재설정하는 것입니다.이 경우 기본 클로저는'{->} ' – winstaan74

+0

나는 비슷한 것을 사용했다. 감사합니다 winstaan. –

1

명 당신이 Thread.sleep()이 오래된 및 성능에 대한 잠재적으로 나쁜 것으로 간주되는 한, 시도 - 캐치 재시도 이런 종류의 기능을 구현하기 위해 ScheduledExecutorService를 사용하여 알려 드릴 것입니다 요즘. 나는 이것을 크 레투 스 (cletus)에 의해 좋은 대답으로 가리킬 예정 이었지만, 내 인생에서 그것을 찾을 수는 없다. 나는 그것을 파헤 치면 내 대답을 업데이트 할 것이다.

편집 : 발견 : How to retry function request after a certain time 잘하면이 도움이됩니다.

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 
}