Requests: Mal manejo de errores en solicitudes en Python 3 [Durante el manejo de la excepción anterior, se produjo otra excepción]

Creado en 16 dic. 2019  ·  3Comentarios  ·  Fuente: psf/requests

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.

Resultado Esperado

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

Resultado actual

'
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:: No se pudo establecer una nueva conexión: [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/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 (': No se pudo establecer una nueva conexión: [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 "", línea 1, en
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 (': No se pudo establecer una nueva conexión: [Errno -2] Nombre o servicio desconocido ',))

'

Pasos de reproducción

import requests

Información del sistema

$ 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).

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.

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

JimHokanson picture JimHokanson  ·  3Comentarios

ReimarBauer picture ReimarBauer  ·  4Comentarios

iLaus picture iLaus  ·  3Comentarios

eromoe picture eromoe  ·  3Comentarios

Matt3o12 picture Matt3o12  ·  3Comentarios