Python Requests模块循环检查端点时的连接/超时错误捕获及处理咨询
Python Requests模块循环检查端点时的连接/超时错误捕获及处理咨询
嗨,Scott!我完全明白你遇到的困扰——脚本一碰到超时或连接失败这类问题就直接崩溃退出,没法继续检查剩下的端点对吧?这在做批量请求校验时真的很常见,咱们一步步来把它解决掉。
首先得明确:这些错误是requests库封装好的异常,它把底层OS层面的网络问题(比如连接失败、超时)转换成了自己的异常类,所以咱们不用去处理系统级的网络错误,只要捕获requests提供的异常就够了。
最合理的做法是在你的get_endpoint_status函数里加入错误捕获逻辑,把这些异常转换成你想要的“类似500状态码”的结果,这样主循环就能一直执行下去,不会中途中断。
具体修改方案
首先导入requests的异常类(或者直接用父类RequestException,能覆盖绝大多数请求相关错误),然后用try-except包裹请求代码:
import requests from requests.exceptions import RequestException, Timeout, ConnectionError # 假设你的headers和proxies已经在外部定义完成 headers = {"Your-Custom-Header": "Header-Value"} proxies = {"http": "your-proxy-address", "https": "your-proxy-address"} def get_endpoint_status(url): try: response = requests.get( url, headers=headers, proxies=proxies, timeout=10 ) return response except (Timeout, ConnectionError) as e: # 专门处理你提到的超时、连接失败这两种高频错误 # 创建模拟响应对象,和真实response结构保持一致,方便主循环复用逻辑 class MockResponse: status_code = 500 url = url text = f"请求错误: {str(e)}" return MockResponse() except RequestException as e: # 兜底捕获其他所有requests相关异常(比如SSL错误、重定向过多等) class MockResponse: status_code = 500 url = url text = f"意外错误: {str(e)}" return MockResponse()
你的主循环代码几乎不用改动,因为我们返回的模拟对象和真实response有一样的status_code和url属性,原有逻辑完全兼容:
# 示例环境列表和端点路径 environments_list = [["env1.example.com"], ["env2.example.com"], ["env3.example.com"]] endpoint = "/api/health-check" # Main loop for environment in environments_list: environment_hostname = environment[0] # Get endpoint status r = get_endpoint_status('https://' + environment_hostname + endpoint) # If good if r.status_code == 200: print(r.status_code) print(r.url) # If not good else: print("Failed") print(r.status_code) print(r.url) # 如果是错误场景,打印错误详情方便排查 if hasattr(r, 'text'): print(r.text)
几个关键点说明
- 为什么在函数里捕获异常?:把错误处理逻辑封装在请求函数里,主循环的代码会更简洁,不用重复写try-except,所有请求的错误都能统一处理。
- 为什么用模拟响应对象?:这样主循环不用区分真实响应和错误情况,只需要检查
status_code就可以了,和你原来的逻辑完全适配。 - 可以自定义状态码吗?:当然可以!如果你不想用500,也可以改成更贴合场景的状态码,比如超时用408、连接失败用503,只需要修改
MockResponse里的status_code值就行。
这样修改后,不管遇到超时、连接失败还是其他请求错误,脚本都不会崩溃,而是会输出"Failed"和对应的错误信息,然后继续检查下一个环境的端点。
备注:内容来源于stack exchange,提问作者Scott




