try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Isso está correto? Existe uma maneira melhor de estruturar isso? Isso cobrirá todas as minhas bases?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Isso está correto? Existe uma maneira melhor de estruturar isso? Isso cobrirá todas as minhas bases?
Respostas:
Dê uma olhada nos documentos de exceção Solicitações . Em resumo:
No caso de um problema de rede (por exemplo, falha no DNS, conexão recusada, etc.), os pedidos criarão uma
ConnectionError
exceção.No caso de uma resposta HTTP inválida rara, os Pedidos gerarão uma
HTTPError
exceção.Se um pedido atingir o tempo limite, uma
Timeout
exceção será gerada.Se uma solicitação exceder o número configurado de redirecionamentos máximos, uma
TooManyRedirects
exceção será gerada.Todas as exceções das quais solicitações explicitamente geram herança
requests.exceptions.RequestException
.
Para responder sua pergunta, o que você mostrar não cobrirá todas as suas bases. Você detectará apenas erros relacionados à conexão, não aqueles que atingem o tempo limite.
O que fazer quando você capturar a exceção depende realmente do design do seu script / programa. É aceitável sair? Você pode continuar e tentar novamente? Se o erro for catastrófico e você não puder continuar, sim, você pode abortar seu programa aumentando SystemExit (uma boa maneira de imprimir um erro e chamar sys.exit
).
Você pode capturar a exceção de classe base, que tratará de todos os casos:
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
raise SystemExit(e)
Ou você pode pegá-los separadamente e fazer coisas 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.
raise SystemExit(e)
Como cristão apontou:
Se você deseja que erros de http (por exemplo, 401 Não Autorizado) gerem exceções, você pode ligar
Response.raise_for_status
. Isso criará umHTTPError
, se a resposta for um erro http.
Um exemplo:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
raise SystemExit(err)
Irá imprimir:
404 Client Error: Not Found for url: http://www.google.com/nothere
socket.timeout
exceções se estiver usando um tempo limite: github.com/kennethreitz/requests/issues/1236
Uma sugestão adicional a ser explícita. Parece melhor ir de específico para geral na pilha de erros para obter o erro desejado, para que os específicos não sejam mascarados pelo geral.
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
O objeto de exceção também contém resposta original e.response
, que pode ser útil se for necessário ver o corpo do erro em resposta do servidor. Por exemplo:
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)