requests peticiones libreria hacer example enviar ejemplos con python request python-requests

libreria - ¿Manera correcta de probar/excepto usando el módulo de peticiones Python?



request python ejemplos (2)

Echa un vistazo a los documentos de excepción de solicitudes. En breve:

En el caso de un problema de red (por ejemplo, falla de DNS, conexión rechazada, etc.), las solicitudes generarán una excepción de error de conexión.

En el caso de una respuesta HTTP no válida, las solicitudes generarán una excepción HTTPError .

Si una solicitud se agota, se produce una excepción de tiempo de Timeout .

Si una solicitud excede el número configurado de redirecciones máximas, se TooManyRedirects una excepción TooManyRedirects .

Todas las excepciones que las Solicitudes generan explícitamente heredan de requests.exceptions.RequestException .

Para responder a su pregunta, lo que muestre no cubrirá todas sus bases. Solo detectará los errores relacionados con la conexión, no los que expiran.

Lo que debe hacer cuando detecta la excepción depende realmente del diseño de su script / programa. ¿Es aceptable salir? ¿Puedes seguir y volver a intentarlo? Si el error es catastrófico y no puede continuar, entonces sí, una llamada a sys.exit() está en orden.

Puede capturar la excepción de clase base, que controlará todos los casos:

try: r = requests.get(url, params={''s'': thing}) except requests.exceptions.RequestException as e: # This is the correct syntax print e sys.exit(1)

O puedes atraparlos por separado y hacer cosas diferentes.

try: r = requests.get(url, params={''s'': thing}) except requests.exceptions.Timeout: # Maybe set up for a retry, or continue in a retry loop except requests.exceptions.TooManyRedirects: # Tell the user their URL was bad and try a different one except requests.exceptions.RequestException as e: # catastrophic error. bail. print e sys.exit(1)

Como Christian señaló:

Si desea que los errores de http (por ejemplo, 401 no autorizados) generen excepciones, puede llamar a Response.raise_for_status . Eso generará un HTTPError , si la respuesta fue un error de http.

Un ejemplo:

try: r = requests.get(''http://www.google.com/nothere'') r.raise_for_status() except requests.exceptions.HTTPError as err: print err sys.exit(1)

Se imprimirá:

404 Client Error: Not Found for url: http://www.google.com/nothere

try: r = requests.get(url, params={''s'': thing}) except requests.ConnectionError, e: print e #should I also sys.exit(1) after this?

¿Es esto correcto? ¿Hay una mejor manera de estructurar esto? ¿Esto cubrirá todas mis bases?


Una sugerencia adicional para ser explícito. Parece que lo mejor es pasar de lo específico a lo general en la pila de errores para obtener el error que se desea detectar, de modo que los específicos no queden enmascarados por el general.

url=''http://www.google.com/blahblah'' try: r = requests.get(url,timeout=3) r.raise_for_status() except requests.exceptions.HTTPError as errh: print ("Http Error:",errh) except requests.exceptions.ConnectionError as errc: print ("Error Connecting:",errc) except requests.exceptions.Timeout as errt: print ("Timeout Error:",errt) except requests.exceptions.RequestException as err: print ("OOps: Something Else",err) Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah

vs

url=''http://www.google.com/blahblah'' try: r = requests.get(url,timeout=3) r.raise_for_status() except requests.exceptions.RequestException as err: print ("OOps: Something Else",err) except requests.exceptions.HTTPError as errh: print ("Http Error:",errh) except requests.exceptions.ConnectionError as errc: print ("Error Connecting:",errc) except requests.exceptions.Timeout as errt: print ("Timeout Error:",errt) OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah