9

Je capture et Python d'impression Les demandes ConnectionErrors bien avec ceci:Obtenir Errno à partir de demandes Python ConnectionError?

except requests.exceptions.ConnectionError as e: 
    logger.warning(str(e.message)) 

Il imprime des messages tels que:

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 61] Connection refused) 

et

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 65] No route to host) 

Et bien d'autres. Ce que je me demande, c'est quel est le meilleur, le plus Pythonic, moyen d'obtenir cette errno qui s'affiche dans le message? Je voudrais avoir un système fiable pour attraper les problèmes et offrir un message d'erreur utile et pertinent à l'utilisateur que possible. Pour autant que je sache, ConnectionError est un défunt indirect de BaseException, sans nouvelles propriétés ou méthodes ajoutées au-delà de ce qu'offre BaseException. J'hésite à utiliser simplement regex car il me semble que je risque de supposer que tous les messages d'erreur sont formatés de la même manière dans toutes les localités.

Répondre

23

Je pense que vous pouvez y accéder en utilisant e.args[0].reason.errno.

Ceci est probablement documenté quelque part, mais généralement quand je dois traquer quelque chose comme ça, je l'essaie juste sur la console et je creuse un peu. (J'utilise IPython donc il est facile de faire l'inspection des onglets, mais essayons ça sans).

Tout d'abord, nous allons générer une erreur en utilisant

import requests 
try: 
    requests.get("http://not.a.real.url/really_not") 
except requests.exceptions.ConnectionError as e: 
    pass 

qui devrait nous donner l'erreur dans e:

>>> e 
ConnectionError(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),) 

L'information est généralement args:

>>> e.args 
(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),) 
>>> e.args[0] 
MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",) 

regardant à l'intérieur, nous voyons:

>>> dir(e.args[0]) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', 
'__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', 
'__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'message', 'pool', 
'reason', 'url'] 

reason regards encourageants:

>>> e.args[0].reason 
gaierror(-2, 'Name or service not known') 
>>> dir(e.args[0].reason) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', 
'__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', 
'__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'errno', 'filename', 
'message', 'strerror'] 
>>> e.args[0].reason.errno 
-2 
+0

+1: Très bien fait! Merci beaucoup! Je suis allé jusqu'à dir (e) et e.args, mais je m'étais arrêté à ce point en prenant les éléments d'e.args pour des chaînes que je devais utiliser regex pour extraire l'information que je voulais. – ArtOfWarfare

+0

L'utilisation d'une fausse URL était également une bonne idée pour générer des erreurs. J'avais utilisé de vraies URL mais avec mon Internet fermé ... il était gênant d'avoir à aller et venir entre générer les erreurs et les rechercher. – ArtOfWarfare

+0

oh mon seigneur - merci merci - cette erreur m'a conduit batty! –

Questions connexes