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