【问题标题】:Need help with python exception handling在 python 异常处理方面需要帮助
【发布时间】:2011-02-15 05:17:30
【问题描述】:

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

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 是因为我的本地路由器无法处理请求并吓坏了,我猜是因为它不能这么快处理请求?如果有人对造成这种情况的原因有任何进一步的了解,那也会有所帮助,但我并不太担心。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      首先,没有理由在新代码中使用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
      

      【讨论】:

      • 请注意,code 属性仅适用于 HTTPError 实例,并且包含 HTTP 状态代码,而不是 errno 值。
      • 另外,发帖人说他们使用的是 Python 3 - Python 3 中没有 urllib2 模块,只有 urllib 包
      • 谢谢,这看起来像我想的那样,不知道为什么它没有来找我。我知道在 2.x 中首选 urllib2,但在 python3 中没有 urllib2,它已被 urllib.request 替换,并且错误被引发为,我相信 urllib.error.URLError 而不仅仅是 URLError。我得稍后再试试看能不能触发,不会太频繁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2023-03-28
      • 1970-01-01
      • 2021-04-13
      相关资源
      最近更新 更多