Requests: Mauvaise gestion des erreurs dans les requêtes en python 3 [Pendant la gestion de l'exception ci-dessus, une autre exception s'est produite]

Créé le 16 déc. 2019  ·  3Commentaires  ·  Source: psf/requests

La bibliothèque de requêtes avec Python3 gère les exceptions d'une manière assez mauvaise. En python2, cela fonctionne bien. J'ai essayé de demander GitHub en utilisant requests.get('https://api.github.com') utilisant à la fois la bibliothèque de requêtes installée python2 et la bibliothèque de requêtes installée python3. Ils fonctionnent différemment lorsque les demandes sont faites pendant que le réseau est en panne. (toute exception est gérée différemment). Essayez d'installer des requêtes à la fois dans python2 et python3 et vous pouvez recréer le problème en supprimant la connexion Internet lors des requêtes. Code que j'ai utilisé
import requests
requests.get('https://api.github.com')

J'ai installé requests==2.5.3 sur mon système et j'ai essayé de mettre à niveau la version vers requests==2.22.0 mais le problème persiste.

résultat attendu

En python2, cela donne une exception plus propre comme la suivante
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 65, in get return request('get', url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 49, in request response = session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 461, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 573, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 415, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(-2, 'Name or service not known'))

Résultat actuel

`
Traceback (appel le plus récent en dernier) :
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", ligne 157, dans _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", ligne 61, dans create_connection
pour res dans socket.getaddrinfo(hôte, port, famille, socket.SOCK_STREAM) :
Fichier "/usr/lib/python3.6/socket.py", ligne 745, dans getaddrinfo
pour res dans _socket.getaddrinfo (hôte, port, famille, type, proto, drapeaux) :
socket.gaierror : [Errno -2] Nom ou service inconnu

Lors du traitement de l'exception ci-dessus, une autre exception s'est produite :

Traceback (appel le plus récent en dernier) :
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", ligne 672, dans urlopen
en morceaux = en morceaux,
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", ligne 376, dans _make_request
self._validate_conn(conn)
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", ligne 994, dans _validate_conn
conn.connect()
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", ligne 334, dans connect
conn = self._new_conn()
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", ligne 169, dans _new_conn
self, "Impossible d'établir une nouvelle connexion : %s" % e
urllib3.exceptions.NewConnectionError :: Échec de l'établissement d'une nouvelle connexion : [Errno -2] Nom ou service inconnu

Lors du traitement de l'exception ci-dessus, une autre exception s'est produite :

Traceback (appel le plus récent en dernier) :
Fichier "/usr/local/lib/python3.6/site-packages/requests/adapters.py", ligne 449, en envoi
délai d'attente = délai d'attente
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", ligne 720, dans urlopen
méthode, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
Fichier "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", ligne 436, par incrément
augmenter MaxRetryError(_pool, url, error ou ResponseError(cause))
urllib3.exceptions.MaxRetryError : HTTPSConnectionPool(host='api.github.com', port=443) : Nombre maximal de tentatives dépassé avec l'url : / (Causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno -2] Nom ou service inconnu',))

Lors du traitement de l'exception ci-dessus, une autre exception s'est produite :

Traceback (appel le plus récent en dernier) :
Déposer "", ligne 1, dans
Fichier "/usr/local/lib/python3.6/site-packages/requests/api.py", ligne 75, dans get
return request('get', url, params=params, *kwargs)Fichier "/usr/local/lib/python3.6/site-packages/requests/api.py", ligne 60, dans la requêtereturn session.request(method=method, url=url, * kwargs)
Fichier "/usr/local/lib/python3.6/site-packages/requests/sessions.py", ligne 533, dans request
resp = self.send(prep, *send_kwargs)Fichier "/usr/local/lib/python3.6/site-packages/requests/sessions.py", ligne 646, en envoir = adapter.send (requête, * kwargs)
Fichier "/usr/local/lib/python3.6/site-packages/requests/adapters.py", ligne 516, en envoi
augmenter ConnectionError(e, request=request)
request.exceptions.ConnectionError : HTTPSConnectionPool(host='api.github.com', port=443) : Nombre maximal de tentatives dépassé avec l'url : / (Causé par NewConnectionError(': Échec de l'établissement d'une nouvelle connexion : [Errno -2] Nom ou service inconnu',))

`

Étapes de reproduction

import requests

Informations système

$ python -m requests.help
Python 2.7.15+ (Python2 version)
requests==2.5.3 (Requests version in python2)
=============================
Python 3.6.9 (Python3 version)
requests==2.5.3(Requests version in python3)
=============================
OS: Ubuntu 18.04.3 LTS

Cette commande n'est disponible que sur les requêtes v2.16.4 et supérieures. Autrement,
veuillez fournir quelques informations de base sur votre système (version Python,
système d'exploitation, etc.).

Commentaire le plus utile

Je viens de tomber sur le même problème, existe-t-il un moyen de continuer après l'erreur avec cette solution de contournement?
Mon programme ne devrait pas se terminer après l'exception déclenchée, mais je n'ai trouvé aucun moyen de le faire.

Tous les 3 commentaires

J'ai également rencontré ce problème, mais j'ai trouvé une solution de contournement pour une sortie plus jolie. Remarquez le "de aucun" dans le script ici :

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

Si vous exécutez le script ci-dessus, la sortie est beaucoup plus claire :

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Vous ne pouvez faire le from None qu'en Python3, et je pense que cela vient de ce PEP : https://www.python.org/dev/peps/pep-0409/

J'ai également rencontré ce problème, mais j'ai trouvé une solution de contournement pour une sortie plus jolie. Remarquez le "de aucun" dans le script ici :

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

Si vous exécutez le script ci-dessus, la sortie est beaucoup plus claire :

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Vous ne pouvez faire le from None qu'en Python3, et je pense que cela vient de ce PEP : https://www.python.org/dev/peps/pep-0409/

Je viens de tomber sur le même problème, existe-t-il un moyen de continuer après l'erreur avec cette solution de contournement?
Mon programme ne devrait pas se terminer après l'exception déclenchée, mais je n'ai trouvé aucun moyen de le faire.

Cette page vous a été utile?
0 / 5 - 0 notes