J'ai une application qui envoie une requête HTTP GET à une URL particulière sur Internet. Mais lorsque le réseau est en panne (par exemple, pas de wifi publique - ou mon fournisseur d'accès est en panne ou quelque chose comme ça), je reçois le retraçage suivant à urllib2.urlopen
:Vérifiez si Internet n'est pas accessible en 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>
Je veux imprimer une erreur amicale à l'utilisateur en lui disant que son réseau peut-être vers le bas au lieu de ce message d'erreur "nodename" ou "servname provided". Bien sûr, je peux attraper URLError
, mais cela attraperait chaque erreur url, pas seulement celui lié à l'indisponibilité du réseau. Je ne suis pas un puriste, donc même un message d'erreur comme "Le serveur example.com ne peut pas être atteint, soit le serveur a des problèmes ou votre connexion réseau est en panne" serait bien. Comment puis-je sélectivement attraper de telles erreurs? (Pour commencer, si la résolution DNS échoue à urllib2.urlopen
, cela peut raisonnablement être considéré comme inaccessibilité réseau? Si oui, comment puis-je "l'attraper" dans le bloc except?)
Si je lis le sous-texte de la question correctement, il y a tellement de composants sur le voyage vers et à partir d'un serveur web que tout ce que vous pouvez dire avec certitude est que vous ne pouvez pas obtenir l'URL . Une erreur DNS n'implique pas un mauvais lien de données, ce pourrait être une panne de serveur de DNS ou un filtre de port ou à peu près n'importe quoi. Ces jours-ci, étant donné que votre routeur par défaut peut être configuré pour (par exemple) ignorer les requêtes ICMP ECHO, vous ne pouvez pas vraiment diagnostiquer les erreurs réseau pour l'utilisateur à partir de la couche d'application. – msw