2011-05-04 44 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。任務失敗時,會自動重試。如果他們繼續失敗,系統會逐步將重試頻率降低至每小時一次。這是一種簡單的方法,可以在不實現一次性重試邏輯的情況下處理API速率限制服務請求。

如果你真的需要同步處理請求,這樣的事情應該工作:

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 result.status_code == 200:break'? – 2011-05-04 12:34:38

+0

應該沒有必要。如果提取返回失敗代碼(404,500),則將引發異常,並且try塊中的任何其他內容都不會運行,包括中斷。 – 2011-05-04 12:49:19

相關問題