检查Python中是否无法访问互联网

3 投票
3 回答
14255 浏览
提问于 2025-04-15 21:58

我有一个应用程序,它会向互联网上的一个特定网址发送HTTP GET请求。但是当网络断了(比如没有公共WiFi,或者我的网络服务提供商出问题了,或者其他类似的情况),我在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>

我想给用户打印一个友好的错误提示,告诉他们网络可能出了问题,而不是这个不友好的“没有提供主机名或服务名”的错误信息。当然,我可以捕获URLError,但那样会捕获到所有的URL错误,而不仅仅是与网络断开相关的错误。

我并不是一个追求完美的人,所以即使是像“无法连接到服务器example.com;可能是服务器确实有问题,或者你的网络连接断了”这样的错误信息也不错。我该如何选择性地捕获这些错误呢?(首先,如果在urllib2.urlopen时DNS解析失败,是否可以合理地认为是网络不可达?如果是的话,我该如何在except块中“捕获”它呢?)

3 个回答

1

urllib2 - 缺失的手册 里有一部分讲得很好,主要是关于如何处理 URLError 和 HTTPError 这两种错误,以及如何区分导致这些错误的具体情况。

1

你可以试着捕捉一下 URLError,然后检查一下它的 reason 属性。如果这个原因不是你想要处理的,就把 URLError 再抛出来,然后在别的地方处理它。

另外,你也可以试试 httplib2。它的 ServerNotFoundError 异常可能更符合你的需求。

7

你应该把请求放在一个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 

撰写回答