Vérifier si l'internet ne sont pas accessibles en Python
J'ai une application qui fait une demande HTTP GET sur une URL particulière sur l'internet. Mais quand le réseau est en panne (par exemple, pas de wifi public - ou de mon fournisseur d'accès est en panne, ou quelque chose de ce genre), j'ai le traceback à 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>
Je veux imprimer un message d'erreur à l'utilisateur en lui disant que son réseau peut-être vers le bas à la place de ce hostile "nodename ni nomserveur fournis" message d'erreur. Sûr que je peux attraper URLError
, mais qui permettraient de capter chaque url erreur, et pas seulement celle qui a trait aux temps d'arrêt du réseau.
Je ne suis pas un puriste, de sorte que même un message d'erreur comme "Le serveur example.com ne peut pas être atteint; soit le serveur est en effet d'avoir des problèmes ou de votre connexion réseau qui est en bas", ce serait bien. Comment dois-je procéder de manière sélective la capture de telles erreurs? (Pour commencer, si la résolution DNS échoue à urllib2.urlopen
, qui peut être raisonnablement supposé que le réseau de l'inaccessibilité? Si oui, comment faire "attraper" dans le bloc except?)
OriginalL'auteur Sridhar Ratnakumar | 2010-04-24
Vous devez vous connecter pour publier un commentaire.
Vous devez envelopper la demande dans un try/except instruction de sorte que vous attrapez la faute et puis laissez-les savoir.
Mais j'ai les deux URLError et HTTPError puisque les deux peuvent se produire.
mais
URLError
- être une classe de base - sera aussi attraperHTTPError
. Je vais l'éditer moi-même.OriginalL'auteur Shane C. Mason
urllib2 - Le Manuel a une bonne section sur la façon de gérer URLError et HTTPError exceptions et comment différencier les conditions qui les ont provoquées.
OriginalL'auteur Amal Sirisena
Comment au sujet de la capture
URLError
, le test de lareason
attribut? Si la raison n'est pas celle qui vous intéresse, re-jeter leURLError
et de les traiter de quelque part d'autre.Sinon, vous pouvez essayer de httplib2. Son
ServerNotFoundError
exception serait probablement répondre à vos besoins.reason
est une instance desocket.gaierror
qui ne se trouve pas dans l'un de pur Python code de la bibliothèque. Essayer de le trouver...Voici la
socket.gaierror
de la documentation: docs.python.org/dev/library/socket.html#socket.gaierrorProblème: urlopen peuvent également par HTTPError (
except URLError
captures). Vous ne savez pas si il peut également lancer d'autres erreurs.OriginalL'auteur splicer