2011-05-04 3 views
5

अक्सर GAE फाइल को अपलोड करने में सक्षम नहीं है और मैं निम्नलिखित त्रुटि हो रही है:त्रुटि के मामले में urlfetch.fetch को कुछ और बार फिर से कैसे निकालें?

ApplicationError: 2 
Traceback (most recent call last): 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 636, in __call__ 
    handler.post(*groups) 
    File "/base/data/home/apps/picasa2vkontakte/1.348093606241250361/picasa2vkontakte.py", line 109, in post 
    headers=headers 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 260, in fetch 
    return rpc.get_result() 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 592, in get_result 
    return self.__get_result_hook(self) 
    File "/base/python_runtime/python_lib/versions/1/google/appengine/api/urlfetch.py", line 355, in _get_fetch_result 
    raise DownloadError(str(err)) 
DownloadError: ApplicationError: 2 

मैं कैसे इस तरह के गलती की स्थिति में पुनः प्रदर्शन करना चाहिए?

 try: 
      result = urlfetch.fetch(url=self.request.get('upload_url'), 
            payload=''.join(data), 
            method=urlfetch.POST, 
            headers=headers 
            ) 
     except DownloadError: 
      # how to retry 2 more times? 
     # and how to verify result here? 

उत्तर

9

यदि आप कर सकते हैं, तो इस काम को the task queue पर ले जाएं। जब कार्य विफल हो जाते हैं, तो वे स्वचालित रूप से पुनः प्रयास करते हैं। यदि वे असफल रहना जारी रखते हैं, तो सिस्टम धीरे-धीरे एक बार प्रति घंटा के रूप में धीमी गति से आवृत्ति को पीछे छोड़ देता है। एक-ऑफ रेट्री तर्क लागू किए बिना रेट-सीमित सेवाओं के लिए एपीआई अनुरोधों को संभालने का यह एक आसान तरीका है।

तुम सच में तुल्यकालिक अनुरोधों को हैंडल करने की जरूरत है, कुछ इस तरह काम करना चाहिए:

for i in range(3): 
    try: 
    result = urlfetch.fetch(...) 
    # run success conditions here 
    break 
    except DownloadError: 
    #logging.debug("urlfetch failed!") 
    pass 

तुम भी deadline=10 पारित कर सकते हैं डिफ़ॉल्ट टाइमआउट की समय सीमा को दोगुना करने urlfetch.fetch करने के लिए।

+0

धन्यवाद, @ ड्रू सीअर्स। 'Status_code' को सत्यापित करने के लिए सही होगा: 'if.status_code == 200: ब्रेक'? –

+0

आवश्यक नहीं होना चाहिए। यदि fetch विफलता कोड (404, 500) देता है तो एक अपवाद फेंक दिया जाएगा और ब्रेक समेत कोशिश ब्लॉक में कुछ भी नहीं चल जाएगा। –

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