需要有关python异常处理的帮助

时间:2011-02-15 05:17:31

标签: python exception exception-handling python-3.x urllib

以下是我目前正在使用的代码:

url = locations[state]['url']
headers = {'User-Agent':'Firefox/3.6.13'}
req = urllib.request.Request(url, headers=headers)
try:
    resp = urllib.request.urlopen(req)
except:
    print('Caught error, trying again...')
    print('This should be handled better, I\'m sorry')
    time.sleep(2)
    resp = urllib.request.urlopen(req)

我遇到的问题,因此我实际关心的例外是在提出请求时偶尔会发生这种情况:

URLError: <urlopen error [Errno 104] Connection reset by peer>

这不是确切的错误,我认为可能是python 2.x的urllib / urllib2而且我在python3上,我认为是urllib.error.URLError iirc。无论如何,我知道我可以做除了URLError它应该工作(虽然我想知道我是否需要做urllib.error.URLError而不是因为它是我的报告),但我如何测试以确保它是因为一个104.我希望它继续重试请求,直到它得到它,或者至少尝试指定的次数,我怎么能最优雅地做到这一点?

从我能找到的错误104是因为我的本地路由器无法处理请求并且吓坏了,我猜是因为它无法如此快速地处理请求?如果有人对这是什么原因有任何进一步的了解,那也会有所帮助,但我并不太关心。

2 个答案:

答案 0 :(得分:1)

查看http://docs.python.org/py3k/library/urllib.error.html

查看异常的reason属性后,您应该能够确定:

  1. 原因属性是socket.error个实例吗?
  2. 如果是,那么该错误的值是2元组,第一个元素是否与errno.ECONNRESET对应?

答案 1 :(得分:-1)

首先,我没有理由在新代码中使用urllib,而是建议使用urllib2

据我所知,你只想在错误104时重试。这就是python中通常做的事情:

import time, urllib.request, urllib2.error
RETRY_DELAY = 2

# build req here
# ...

for x in range(10): # Always limit number of retries
  try:
    resp = urllib.request.urlopen(req)
  except urllib.error.URLError:
    if e.reason[0] == 104: # Will throw TypeError if error is local, but we probably don't care
      time.sleep(RETRY_DELAY)
    else:
      raise # re-raise any other error
  else:
    break # We've got resp sucessfully, stop iteration