Requests: Tratamento de erros incorreto em solicitações em python 3 [durante o tratamento da exceção acima, ocorreu outra exceção]

Criado em 16 dez. 2019  ·  3Comentários  ·  Fonte: psf/requests

A biblioteca de solicitações com Python3 lida com exceções de uma maneira muito ruim. Em python2, isso funciona bem. Tentei solicitar o GitHub usando requests.get('https://api.github.com') usando a biblioteca de solicitações instaladas python2 e a biblioteca de solicitações instaladas python3. Eles têm um desempenho diferente quando as solicitações são feitas durante o desligamento da rede. (qualquer exceção é tratada de forma diferente). Tente instalar solicitações em python2 e python3 e você pode recriar o problema removendo a conexão com a Internet ao fazer as solicitações. Código que usei
import requests
requests.get('https://api.github.com')

Instalei requests==2.5.3 no meu sistema e tentei atualizar a versão para requests==2.22.0 mas o problema ainda persiste.

resultado esperado

Em python2, oferece uma exceção mais limpa como a seguinte
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 atual

`
Traceback (última chamada mais recente):
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", linha 157, em _new_conn
(self._dns_host, self.port), self.timeout, ** extra_kw
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py", linha 61, em create_connection
para res em socket.getaddrinfo (host, porta, família, socket.SOCK_STREAM):
Arquivo "/usr/lib/python3.6/socket.py", linha 745, em getaddrinfo
para res em _socket.getaddrinfo (host, porta, família, tipo, proto, sinalizadores):
socket.gaierror: [Errno -2] Nome ou serviço desconhecido

Durante o tratamento da exceção acima, outra exceção ocorreu:

Traceback (última chamada mais recente):
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", linha 672, em urlopen
chunked = chunked,
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", linha 376, em _make_request
self._validate_conn (conn)
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", linha 994, em _validate_conn
conn.connect ()
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", linha 334, em conectar
conn = self._new_conn ()
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connection.py", linha 169, em _new_conn
self, "Falha ao estabelecer uma nova conexão:% s"% e
urllib3.exceptions.NewConnectionError:: Falha ao estabelecer uma nova conexão: [Errno -2] Nome ou serviço desconhecido

Durante o tratamento da exceção acima, outra exceção ocorreu:

Traceback (última chamada mais recente):
Arquivo "/usr/local/lib/python3.6/site-packages/requests/adapters.py", linha 449, em envio
tempo limite = tempo limite
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", linha 720, em urlopen
método, url, erro = e, _pool = self, _stacktrace = sys.exc_info () [2]
Arquivo "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", linha 436, em incremento
aumentar MaxRetryError (_pool, url, erro ou ResponseError (causa))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool (host = 'api.github.com', port = 443): Máximo de tentativas excedido com url: / (Causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno -2] Nome ou serviço desconhecido ',))

Durante o tratamento da exceção acima, outra exceção ocorreu:

Traceback (última chamada mais recente):
Arquivo "", linha 1, em
Arquivo "/usr/local/lib/python3.6/site-packages/requests/api.py", linha 75, em get
solicitação de retorno ('get', url, params = params, * kwargs)Arquivo "/usr/local/lib/python3.6/site-packages/requests/api.py", linha 60, na solicitaçãoreturn session.request (method = method, url = url, * kwargs)
Arquivo "/usr/local/lib/python3.6/site-packages/requests/sessions.py", linha 533, na solicitação
resp = self.send (prep, * send_kwargs)Arquivo "/usr/local/lib/python3.6/site-packages/requests/sessions.py", linha 646, em envior = adapter.send (request, * kwargs)
Arquivo "/usr/local/lib/python3.6/site-packages/requests/adapters.py", linha 516, em envio
aumentar ConnectionError (e, solicitação = solicitação)
request.exceptions.ConnectionError: HTTPSConnectionPool (host = 'api.github.com', port = 443): Máximo de tentativas excedido com url: / (Causado por NewConnectionError (': Falha ao estabelecer uma nova conexão: [Errno -2] Nome ou serviço desconhecido ',))

`

Etapas de reprodução

import requests

Informação do 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 está disponível apenas em Requests v2.16.4 e superior. De outra forma,
forneça algumas informações básicas sobre o seu sistema (versão Python,
sistema operacional, etc.).

Comentários muito úteis

Acabei de me deparar com o mesmo problema, há alguma maneira com essa solução alternativa para continuar após o erro?
Meu programa não deve sair após a exceção levantada, mas não encontrei nenhuma maneira de fazer isso.

Todos 3 comentários

Também encontrei este problema, mas encontrei uma solução para um resultado mais bonito. Observe o "de nenhum" no script aqui:

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

Se você executar o script acima, a saída será muito mais limpa:

$ 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/

Você só pode fazer from None em Python3, e acho que vem deste PEP: https://www.python.org/dev/peps/pep-0409/

Também encontrei este problema, mas encontrei uma solução para um resultado mais bonito. Observe o "de nenhum" no script aqui:

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

Se você executar o script acima, a saída será muito mais limpa:

$ 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/

Você só pode fazer from None em Python3, e acho que vem deste PEP: https://www.python.org/dev/peps/pep-0409/

Acabei de me deparar com o mesmo problema, há alguma maneira com essa solução alternativa para continuar após o erro?
Meu programa não deve sair após a exceção levantada, mas não encontrei nenhuma maneira de fazer isso.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

xsren picture xsren  ·  3Comentários

ReimarBauer picture ReimarBauer  ·  4Comentários

iLaus picture iLaus  ·  3Comentários

avinassh picture avinassh  ·  4Comentários

ghtyrant picture ghtyrant  ·  3Comentários