try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
È corretto? C'è un modo migliore per strutturarlo? Questo coprirà tutte le mie basi?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
È corretto? C'è un modo migliore per strutturarlo? Questo coprirà tutte le mie basi?
Risposte:
Dai un'occhiata ai documenti di eccezione Richieste . In breve:
In caso di un problema di rete (ad es. Errore DNS, connessione rifiutata, ecc.), Le richieste genereranno
ConnectionError
un'eccezione.Nel caso della rara risposta HTTP non valida, le richieste genereranno
HTTPError
un'eccezione.Se una richiesta scade,
Timeout
viene sollevata un'eccezione.Se una richiesta supera il numero configurato di reindirizzamenti massimi,
TooManyRedirects
viene sollevata un'eccezione.Tutte le eccezioni da cui Requests genera esplicitamente l'ereditarietà
requests.exceptions.RequestException
.
Per rispondere alla tua domanda, ciò che mostri non coprirà tutte le tue basi. Riceverai solo errori relativi alla connessione, non quelli che scadono.
Cosa fare quando si rileva l'eccezione dipende davvero dalla progettazione del proprio script / programma. È accettabile uscire? Puoi continuare e riprovare? Se l'errore è catastrofico e non è possibile continuare, quindi sì, è possibile interrompere il programma sollevando SystemExit (un modo semplice per stampare un errore e chiamaresys.exit
).
Puoi prendere l'eccezione della classe base, che gestirà tutti i casi:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
Oppure puoi prenderli separatamente e fare cose diverse.
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.
raise SystemExit(e)
Come ha sottolineato Christian :
Se si desidera che errori http (ad es. 401 non autorizzati) generino eccezioni, è possibile chiamare
Response.raise_for_status
. Ciò solleverà unHTTPError
, se la risposta fosse un errore http.
Un esempio:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
Stampa:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
eccezioni se stai usando un timeout: github.com/kennethreitz/requests/issues/1236
Un suggerimento aggiuntivo per essere esplicito. Sembra meglio passare dallo specifico al generale nella pila di errori per ottenere l'errore desiderato, quindi quelli specifici non vengono mascherati da quello generale.
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
L'oggetto eccezione contiene anche una risposta originale e.response
, che potrebbe essere utile se fosse necessario vedere il corpo dell'errore in risposta dal server. Per esempio:
try:
r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
r.raise_for_status()
except requests.exceptions.HTTPError as e:
print (e.response.text)