2011-06-14 15 views
7

मैं इस तरह एक गहरे लाल रंग का कोड है:रूबी - निष्पादन की समय सीमा समाप्त

begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
end 

और मैं के रूप में लॉग हो रही है:

ERROR -- : Error: execution expired 

मैं इसे सफलता जब तक फिर से अमल ब्लॉक करना चाहते हैं।

मैं यह कैसे कर सकता हूं?

+0

सबसे पहले के रूप में इस आसान bugfixing –

+0

सक्षम हो सकता है तुम्हारा मतलब है इस ?: 'डॉक = खुला (यूआरएल) डॉक = Nokogiri :: एचटीएमएल .read.strip (, यह nokogiri में पारित करने से separetly यूआरएल को खोलने का प्रयास डॉक्टर) ' – Sayuj

+0

नहीं मेरा मतलब है 'डेटा = ओपन (यूआरएल) .read.strip' फिर अगली पंक्ति' डॉक्टर = नोकोगिरी :: एचटीएमएल (डेटा)' –

उत्तर

24

मैं अपनी टिप्पणी पर थोड़ा सा विस्तार करूंगा। आप begin वापस जाने के लिए retry उपयोग कर सकते हैं:

begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
    retry 
end 

की कोशिश कर रहा है (और प्रवेश त्रुटियों) रखेंगे कि जब तक यह काम करता है या आप मैन्युअल रूप से यह मार डालते हैं। शायद यह नहीं है कि आप क्या चाहते हैं हालांकि एक छोटी गलती आपको अनंत लूप में भेज देगी।

MAX_ATTEMPTS = 10 

doc = nil 
begin 
    doc = Nokogiri::HTML(open(url).read.strip) 
rescue Exception => ex 
    log.error "Error: #{ex}" 
    attempts = attempts + 1 
    retry if(attempts < MAX_ATTEMPTS) 
end 

if(doc.nil?) 
    # Do something about the persistent error 
    # so that you don't try to access a nil 
    # doc later on. 
end 

कुछ इस तरह कई बार कोशिश करेंगे और फिर छोड़ देना: कि चारों ओर एक आसान तरीका है इसके लिए कहते हैं, कोशिश, 10 बार और फिर छोड़ देना जाने के लिए है। retry से पहले आप sleep कॉल भी डाल सकते हैं यदि आप अगले प्रयास से थोड़ा पहले इंतजार करना चाहते हैं या अपवाद की जांच करना चाहते हैं (संभवतः एकाधिक rescue ब्लॉक के साथ) यह चुनने के लिए कि क्या आपको तुरंत छोड़ देना है, प्रतीक्षा करें और पुनः प्रयास करें या तुरंत पुनः प्रयास करें।

संबंधित मुद्दे