检查Python中是否无法访问互联网
我有一个应用程序,它会向互联网上的一个特定网址发送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