如何在出错时重试urlfetch.fetch几次?

5 投票
1 回答
2043 浏览
提问于 2025-04-16 16:58

很多时候,GAE(谷歌应用引擎)无法上传文件,我遇到了以下错误:

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?

1 个回答

9

如果可以的话,把这个工作放到任务队列里去做。当任务失败时,它会自动重试。如果一直失败,系统会逐渐降低重试的频率,慢到每小时才重试一次。这是一种简单的方法,可以处理那些有请求限制的服务,而不需要自己写复杂的重试逻辑。

如果你真的需要同步处理请求,可以试试下面这样的代码:

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

你还可以给urlfetch.fetch加上deadline=10,这样可以把默认的超时时间加倍。

撰写回答