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?)

Si je suis en train de lire le sous-texte de la question correctement, il ya tellement de nombreux éléments sur le voyage vers et à partir d'un serveur web tout ce que vous pouvez dire avec certitude, c'est que vous ne pouvez pas obtenir l'URL. Une erreur DNS n'implique pas une mauvaise liaison de données, il pourrait être un serveur DNS défaillance ou d'un port de filtre ou de quoi que ce soit. Ces jours-ci, étant donné que votre routeur par défaut peut être défini pour (par exemple) ignorer les Requêtes d'ÉCHO ICMP, vous ne pouvez pas vraiment diagnostiquer les pannes de réseau pour l'utilisateur de la couche d'application.

OriginalL'auteur Sridhar Ratnakumar | 2010-04-24