Проверьте, если Интернет не может быть доступен в Python - PullRequest
3 голосов
/ 24 апреля 2010

У меня есть приложение, которое отправляет 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, это можно разумно предположить как недоступность сети? Если так, как мне «перехватить» его в блоке исключений?)

Ответы [ 3 ]

8 голосов
/ 24 апреля 2010

Вам следует заключить запрос в оператор try / исключением, чтобы вы уловили ошибку и затем сообщили об этом.

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 
1 голос
/ 24 апреля 2010

Как насчет перехвата URLError и проверки атрибута reason? Если причина не в том, что вас интересует, перебросьте URLError и обработайте его где-нибудь еще.

Кроме того, вы можете попробовать httplib2 . Его исключение ServerNotFoundError, вероятно, подойдет вашим потребностям.

1 голос
/ 24 апреля 2010

urllib2 - Пропущенное руководство содержит хороший раздел о том, как обрабатывать исключения URLError и HTTPError и как дифференцировать условия, которые их вызвали.

...