2010-04-24 2 views
3

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

+1

Если я правильно читал подтекст вопроса, есть очень много компонентов, на поездки и из веб-сервера, что все, что можно сказать с уверенностью в том, что вы не можете получить URL , Ошибка DNS не означает плохую связь данных, это может быть сбой DNS-сервера или фильтр портов или почти что-либо. В эти дни, учитывая, что ваш маршрутизатор по умолчанию может быть настроен на (например,) игнорировать запросы ICMP ECHO, вы не можете действительно диагностировать сетевые сбои для пользователя из прикладного уровня. – msw

ответ

8

Вы должны обернуть запрос в оператор 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 
+0

Это то, что я использовал, за исключением ... HTTPError должен превышать URLError. Если вы можете исправить это, я буду отмечать ваш ответ как правильный. –

+0

Но у меня есть URLError и HTTPError, так как оба могут там встречаться. –

+2

, но 'URLError' - являющийся базовым классом - также поймает' HTTPError'. Я сам отредактирую. –

1

urllib2 - The Missing Manual имеет хороший раздел о том, как обращаться Исключения URLError и HTTPError и как различать условия, вызвавшие их.

1

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

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

+0

'reason' - это экземпляр' socket.gaierror', который не найден ни в одном из чистого кода библиотеки Python. Попытка найти его ... –

+0

Вот документация 'socket.gaierror': http://docs.python.org/dev/library/socket.html#socket.gaierror – splicer

+0

Проблема: urlopen может также через HTTPError (' except URLError 'ловит его тоже). Не уверен, что это может также вызвать другие ошибки. –

Смежные вопросы