如何在Python中跳过'Connection aborted.'与OSError(0, 'Error')错误?
解决方法
你的代码逻辑上应该能捕获requests.exceptions.ConnectionError,但可能因为缩进、异常引用或者执行流程的问题,导致没触发预期的sleep重试逻辑。下面是修正后的可靠实现:
import requests import time def get_with_retry(my_url): max_tries = 3 # 可根据需求调整重试次数 for try_num in range(max_tries): try: # 第一次请求用20秒超时,重试用30秒 timeout = 30 if try_num > 0 else 20 resp = requests.get(my_url, timeout=timeout) # 可选:如果要处理HTTP状态码错误(比如404、500),加上这行 resp.raise_for_status() return resp except requests.exceptions.ConnectionError: if try_num == max_tries - 1: # 最后一次重试失败,抛出异常或者返回None,按需选择 raise time.sleep(10) except Exception: if try_num == max_tries - 1: raise time.sleep(10) # 使用示例 # result = get_with_retry("你的目标URL")
核心优化点:
- 用循环实现重试,避免重复写请求代码,逻辑更清晰
- 动态调整超时时间,重试时给更长的超时窗口
- 限制最大重试次数,防止无限阻塞
- 明确区分ConnectionError和其他异常的处理逻辑
排查原代码失效的可能原因:
- 缩进错误:Python对缩进严格,检查
except块是否和try保持同一层级的缩进 - 异常引用错误:确认已经导入
requests模块,requests.exceptions.ConnectionError拼写完全正确 - 异常类型不匹配:可以临时用
except Exception as e捕获所有异常,打印type(e)确认实际抛出的异常类型,再针对性调整捕获逻辑
比如临时调试代码:
try: req = requests.get(my_url, timeout=20) except Exception as e: print(f"实际异常类型: {type(e)}") print(f"异常详情: {str(e)}") time.sleep(10) req = requests.get(my_url, timeout=30)
这样就能确定是不是捕获的异常类型和实际抛出的不匹配,再调整代码即可。
内容的提问来源于stack exchange,提问作者KJ H
相关产品推荐
相关产品推荐

