2011-08-17 29 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 - आपके सुझाव पर मैंने व्यक्तिगत अपवादों को एकत्रित करने में जोड़ा है। एक स्टैकट्रैस नहीं चाहते हैं - निश्चित रूप से, यह बिंदु को चित्रित करने के लिए बस है। चूंकि अपवादों को अंत में रिपोर्ट करने के लिए एकत्रित किया जा रहा है, हो सकता है कि त्रुटि का उद्देश्य हैन्डलर को 'body.call() 'से पहले संसाधनों की आवश्यकता हो, रीसेट करने से पहले - डिफ़ॉल्ट स्थिति केवल {{>>} हो सकती है ' – winstaan74

+0

मैं कुछ इसी तरह का उपयोग कर समाप्त हो गया। धन्यवाद winstaan। –

1

आजकल लोग ScheduledExecutorService का उपयोग इस प्रकार की कोशिश-पकड़-पुनः प्रयास कार्यक्षमता को लागू करने के लिए करेंगे, क्योंकि Thread.sleep() को पुराने और प्रदर्शन के लिए संभावित रूप से खराब माना जाता है। मैं आपको क्लीटस द्वारा इस पर एक अच्छे जवाब के लिए इंगित करने जा रहा था, लेकिन मेरे जीवन के लिए यह नहीं मिल सकता है। अगर मैं इसे खोद सकता हूं तो मैं अपना जवाब अपडेट करूंगा।

संपादित करें: इसे मिला: 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 
} 
संबंधित मुद्दे