У меня есть приложение, которое отправляет HTTP-запрос GET на определенный URL-адрес в Интернете. Но когда сеть не работает (скажем, нет общедоступного Wi-Fi - или мой провайдер не работает, или что-то подобное), я получаю следующую трассировку в 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
, это можно разумно предположить как недоступность сети? Если так, как мне «перехватить» его в блоке исключений?)