La biblioteca de solicitudes con Python3 maneja las excepciones de una manera bastante mala. En python2 esto funciona bien. Intenté solicitar GitHub usando requests.get('https://api.github.com')
usando la biblioteca de solicitudes instalada python2 y la biblioteca de solicitudes instalada python3. Funcionan de manera diferente cuando las solicitudes se realizan cuando la red está inactiva. (cualquier excepción se maneja de manera diferente). Intente instalar solicitudes tanto en python2 como en python3 y puede recrear el problema eliminando la conexión a Internet al realizar las solicitudes. Código que utilicé
import requests
requests.get('https://api.github.com')
He instalado requests==2.5.3
en mi sistema e intenté actualizar la versión a requests==2.22.0
pero el problema persiste.
En python2 da una excepción más limpia como la siguiente
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'))
'
Rastreo (llamadas recientes más última):
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", línea 157, en _new_conn
(self._dns_host, self.port), self.timeout, ** extra_kw
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", línea 61, en create_connection
para res en socket.getaddrinfo (host, puerto, familia, socket.SOCK_STREAM):
Archivo "/usr/lib/python3.6/socket.py", línea 745, en getaddrinfo
para res en _socket.getaddrinfo (host, puerto, familia, tipo, proto, banderas):
socket.gaierror: [Errno -2] Nombre o servicio desconocido
Durante el manejo de la excepción anterior, se produjo otra excepción:
Rastreo (llamadas recientes más última):
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", línea 672, en urlopen
chunked = chunked,
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", línea 376, en _make_request
self._validate_conn (conexión)
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", línea 994, en _validate_conn
conexión de conexión ()
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", línea 334, en connect
conn = self._new_conn ()
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", línea 169, en _new_conn
self, "No se pudo establecer una nueva conexión:% s"% e
urllib3.exceptions.NewConnectionError:
Durante el manejo de la excepción anterior, se produjo otra excepción:
Rastreo (llamadas recientes más última):
Archivo "/usr/local/lib/python3.6/site-packages/requests/adapters.py", línea 449, en envío
timeout = tiempo de espera
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", línea 720, en urlopen
método, url, error = e, _pool = self, _stacktrace = sys.exc_info () [2]
Archivo "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", línea 436, en incrementos
subir MaxRetryError (_pool, url, error o ResponseError (causa))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool (host = 'api.github.com', port = 443): Se superó el máximo de reintentos con url: / (Causado por NewConnectionError ('
Durante el manejo de la excepción anterior, se produjo otra excepción:
Rastreo (llamadas recientes más última):
Archivo "
Archivo "/usr/local/lib/python3.6/site-packages/requests/api.py", línea 75, en get
solicitud de devolución ('get', url, params = params, * kwargs)Archivo "/usr/local/lib/python3.6/site-packages/requests/api.py", línea 60, en solicitudreturn session.request (método = método, url = url, * kwargs)
Archivo "/usr/local/lib/python3.6/site-packages/requests/sessions.py", línea 533, en solicitud
resp = self.send (preparación, * send_kwargs)Archivo "/usr/local/lib/python3.6/site-packages/requests/sessions.py", línea 646, en envíor = adapter.send (solicitud, * kwargs)
Archivo "/usr/local/lib/python3.6/site-packages/requests/adapters.py", línea 516, en envío
elevar ConnectionError (e, request = request)
request.exceptions.ConnectionError: HTTPSConnectionPool (host = 'api.github.com', port = 443): Se superó el máximo de reintentos con url: / (Causado por NewConnectionError ('
'
import requests
$ 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
Este comando solo está disponible en Solicitudes v2.16.4 y posteriores. De lo contrario,
proporcione información básica sobre su sistema (versión de Python,
sistema operativo, & c).
También encontré este problema, pero encontré una solución para una salida más bonita. Observe el "de Ninguno" en el guión aquí:
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 ejecuta el script anterior, la salida es mucho más limpia:
$ 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/
Solo puede hacer el from None
en Python3, y creo que proviene de este PEP: https://www.python.org/dev/peps/pep-0409/
También encontré este problema, pero encontré una solución para una salida más bonita. Observe el "de Ninguno" en el guión aquí:
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 ejecuta el script anterior, la salida es mucho más limpia:
$ 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/
Solo puede hacer el
from None
en Python3, y creo que proviene de este PEP: https://www.python.org/dev/peps/pep-0409/
Me encontré con el mismo problema, ¿hay alguna forma de que esta solución continúe después del error?
Mi programa no debería salir después de la excepción generada, pero no encontré ninguna forma de hacerlo.
Comentario más útil
Me encontré con el mismo problema, ¿hay alguna forma de que esta solución continúe después del error?
Mi programa no debería salir después de la excepción generada, pero no encontré ninguna forma de hacerlo.