【发布时间】:2010-04-24 01:11:44
【问题描述】:
我有一个应用程序向 Internet 上的特定 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>
我想向用户打印一个友好的错误,告诉他他的网络可能已关闭,而不是这个不友好的“提供节点名或服务名”错误消息。当然我可以捕获URLError,但这会捕获每个 url 错误,而不仅仅是与网络停机时间相关的错误。
我不是一个纯粹主义者,所以即使是“无法访问服务器 example.com;服务器确实有问题或者您的网络连接已关闭”这样的错误消息也会很好。如何有选择地捕获此类错误? (首先,如果 DNS 解析在 urllib2.urlopen 失败,可以合理地假设为网络不可访问?如果是这样,我如何在 except 块中“捕获”它?)
【问题讨论】:
-
如果我正确阅读了问题的子文本,那么在往返网络服务器的过程中有太多组件,您可以肯定地说您无法获得网址。 DNS 错误并不意味着数据链接错误,它可能是 DNS 服务器故障或端口过滤器或任何其他原因。如今,鉴于您的默认路由器可能设置为(例如)忽略 ICMP ECHO 请求,您无法真正从应用层为用户诊断网络故障。
标签: python exception networking urllib2