检查是否无法在Python中访问Internet

时间:2010-04-24 01:11:45

标签: python exception networking urllib2

我有一个应用程序,它对互联网上的特定URL发出HTTP GET请求。但是当网络关闭时(比如没有公共wifi - 或者我的ISP关闭,或者其他类似的事情),我在urllib2.urlopen获得了以下追溯:

70, in get
    u = urllib2.urlopen(req)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 391, in open
    response = self._open(req, data)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 409, in _open
    '_open', req)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 1161, in http_open
    return self.do_open(httplib.HTTPConnection, req)
  File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib2.py", line 1136, in do_open
    raise URLError(err)
URLError: <urlopen error [Errno 8] nodename nor servname provided, or not known>

我想向用户打印一个友好的错误,告诉他他的网络可能已关闭而不是这个不友好的“nodename也没有提供servname”错误消息。当然我可以捕获URLError,但这会捕获每个 url错误,而不仅仅是与网络停机相关的错误。

我不是纯粹主义者,所以即使是“无法访问服务器example.com;服务器确实出现问题或者网络连接中断”这样的错误消息也不错。如何有选择地捕获此类错误? (首先,如果在urllib2.urlopen处DNS解析失败,可以合理地假设为网络不可访问性?如果是,我如何在except块中“捕获”它?)

3 个答案:

答案 0 :(得分:8)

您应该将请求包装在try / except语句中,以便捕获错误然后让他们知道。

try:
   u = urllib2.urlopen(req)
except HTTPError as e:
   #inform them of the specific error here (based off the error code)
except URLError as e:
   #inform them of the specific error here
except Exception as e:
   #inform them that a general error has occurred 

答案 1 :(得分:1)

urllib2 - The Missing Manual有一个很好的部分,介绍如何处理URLError和HTTPError异常,以及如何区分导致它们的条件。

答案 2 :(得分:1)

如何捕获URLError,然后测试reason属性?如果原因不是您感兴趣的原因,请重新抛出URLError并在其他地方处理。

或者,您可以尝试httplib2。它的ServerNotFoundError例外可能会满足您的需求。