Como lidar com o erro MaxRetryError da urllib3 no Python
O erro urllib3.exceptions.MaxRetryError geralmente ocorre quando o Python não consegue estabelecer uma conexão com um servidor, mesmo após múltiplas tentativas. Este erro indica que todas as tentativas de conexão foram esgotadas sem sucesso.
Entendendo o erro MaxRetryError no Python
Esse tipo de erro aparece comumente ao usar bibliotecas que fazem requisições HTTP, como urllib3
, especialmente em aplicações que dependem de servidores locais ou APIs externas. O trecho abaixo é um exemplo da mensagem que pode ser exibida:
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=40215): Max retries exceeded with url: /session/b681ad139c56b8cebff586822d3f7064/url (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f4f210e4d60>: Failed to establish a new connection: [Errno 111] Connection refused'))
Esse erro indica que seu código tentou acessar o servidor na porta 40215, mas não conseguiu se conectar. Isso pode acontecer por diversos motivos, como:
- O servidor não estar ativo ou disponível no momento.
- Porta incorreta especificada na URL.
- Firewalls ou antivírus bloqueando a conexão local.
- Problemas de rede ou configurações no ambiente de desenvolvimento.
Exemplo prático com tratamento de exceção
Veja abaixo um exemplo de como capturar a exceção MaxRetryError
e tentar novamente a conexão automaticamente por até 10 vezes, com intervalo de 1 minuto entre as tentativas:
import time
import urllib3
# define o número máximo de tentativas
max_attempts = 10
for i in range(max_attempts):
try:
# tenta estabelecer uma conexão com o servidor
http = urllib3.PoolManager()
response = http.request('GET', 'http://localhost:40215/session/b681ad139c56b8cebff586822d3f7064/url')
# se a conexão for bem-sucedida, sai do loop
break
except urllib3.exceptions.MaxRetryError:
print(f"Tentativa {i+1} falhou. Aguardando 1 minuto...")
for j in range(60, 0, -1):
print(f"\rTentativa {i+1} em {j} segundos.", end="")
time.sleep(1)
print("")
# verifica se a conexão foi bem-sucedida
if 'response' in locals() and response.status == 200:
print("Conexão estabelecida com sucesso!")
else:
print("Não foi possível estabelecer a conexão.")
Dicas importantes ao usar urllib3
- Verifique se o servidor local realmente está rodando e escutando na porta especificada.
- Use ferramentas como
netstat
oucurl
para testar a conexão local manualmente. - Considere configurar o número máximo de tentativas e o tempo de espera padrão com
Retry
da própria biblioteca urllib3.
Imagem ilustrativa
Links úteis
Vídeo recomendado
Assista ao conteúdo em vídeo sobre erros e automações Python no canal @CanalQb:
@CanalQb no YouTube
Conclusão
O erro MaxRetryError
pode ser frustrante, mas com o tratamento adequado, é possível garantir mais estabilidade e resiliência para seus scripts Python. Com abordagens como a repetição programada e verificação de disponibilidade do servidor, você melhora a confiabilidade das automações web que dependem de conexões HTTP.