У меня есть приложение, которое делает HTTP GET-запрос конкретному URL-адресу в Интернете. Но когда сеть не вниз (скажем, нет общественного Wi-Fi - или мой ISP вниз, или некоторые такие вещи), я получаю следующее отслеживающий в urllib2.urlopen
:Проверьте, не доступен ли доступ к Интернету в Python
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 provided». Конечно, я могу поймать URLError
, но это поймает каждую ошибку url, а не только ту, что связана с простоями сети.
Я не пурист, поэтому даже сообщение об ошибке вроде «Не удалось установить сервер example.com, либо на сервере действительно есть проблемы, либо на вашем сетевом подключении». Как я могу выборочно ловить такие ошибки? (Для начала, если разрешение DNS не работает на urllib2.urlopen
, что можно разумно считать недоступным в сети? Если да, то как его «поймать» в исключающем блоке?)
Если я правильно читал подтекст вопроса, есть очень много компонентов, на поездки и из веб-сервера, что все, что можно сказать с уверенностью в том, что вы не можете получить URL , Ошибка DNS не означает плохую связь данных, это может быть сбой DNS-сервера или фильтр портов или почти что-либо. В эти дни, учитывая, что ваш маршрутизатор по умолчанию может быть настроен на (например,) игнорировать запросы ICMP ECHO, вы не можете действительно диагностировать сетевые сбои для пользователя из прикладного уровня. – msw