在 Python 中,当你使用网络库(如 requests
或 socket
)进行网络请求时,可能会遇到操作系统错误 104(连接中断错误)。这个错误通常表示在尝试与远程服务器通信时,连接被对方关闭或中断。
你可以捕获异常并在一定次数内重试请求。
import requests
from requests.exceptions import ConnectionError, Timeout
url = 'http://example.com'
max_retries = 3
retry_count = 0
while retry_count < max_retries:
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # 检查是否有HTTP错误
print(response.text)
break # 成功后退出循环
except (ConnectionError, Timeout) as e:
retry_count += 1
print(f"Attempt {retry_count} failed: {e}")
if retry_count == max_retries:
print("Max retries reached. Exiting.")
有时,增加超时时间可以解决问题。
try:
response = requests.get(url, timeout=10) # 增加超时时间
response.raise_for_status()
print(response.text)
except (ConnectionError, Timeout) as e:
print(f"Request failed: {e}")
确保你的网络连接稳定,可以通过其他工具(如浏览器)访问相同的URL,检查是否能正常访问。
确保防火墙或安全软件没有阻止你的请求。你可以暂时禁用这些软件,看看问题是否解决。
有时,使用不同的网络库可能会解决问题。例如,使用 http.client
或 urllib3
。
import http.client
conn = http.client.HTTPConnection("example.com")
conn.request("GET", "/")
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data)
conn.close()
以下是一个完整的示例,展示了如何捕获异常并重试请求:
import requests
from requests.exceptions import ConnectionError, Timeout
def fetch_url(url, max_retries=3, timeout=5):
retry_count = 0
while retry_count < max_retries:
try:
response = requests.get(url, timeout=timeout)
response.raise_for_status() # 检查是否有HTTP错误
return response.text
except (ConnectionError, Timeout) as e:
retry_count += 1
print(f"Attempt {retry_count} failed: {e}")
if retry_count == max_retries:
print("Max retries reached. Exiting.")
return None
url = 'http://example.com'
result = fetch_url(url)
if result:
print(result)
else:
print("Failed to fetch the URL.")
领取专属 10元无门槛券
手把手带您无忧上云