Python遍历列表遇连接错误时如何保持循环执行的技术问题
问题修复:让脚本遍历所有ID不中断
嘿,我帮你定位到问题所在了——当前代码在某个ID触发get_data()里的异常后,虽然函数内部捕获了异常,但返回的是布尔值False,之后你尝试调用data.json()时,会因为False没有json()方法抛出AttributeError,直接导致整个循环停止,没法处理后面的ID。
下面是修改后的完整代码,以及关键改动的说明:
修改后的主循环代码
id_list = [1, 2, 3] for id in id_list: data = get_data(id) # 先判断是否拿到了有效的响应对象 if isinstance(data, requests.Response): try: data_json = data.json() # 检查返回数据和任务状态 if data_json and data_json.get('job_status') == 'SUCCESS': # 这里写你要执行的业务逻辑 print(f"✅ 成功处理ID {id}") else: print(f"⚠️ ID {id} 的任务状态不是SUCCESS或无有效返回数据") except ValueError: # 处理返回内容不是合法JSON的情况 print(f"❌ ID {id} 返回的内容无法解析为JSON") else: print(f"❌ ID {id} 未找到或获取数据失败")
修改后的get_data()函数
def get_data(form_id): try: print("------- Getting data from Source. Please wait. -------\n") # 注意:这里要补充你实际发起请求的代码,比如: # response = requests.get(f"your_api_endpoint/{form_id}") response.raise_for_status() print(response.content) return response except (RuntimeError, TypeError, NameError, snowCtx.connection.errors.Error, requests.exceptions.HTTPError) as e: error_msg = f"******* Error from Source (GETTING DATA): *******\n{str(e)} on form id: {str(form_id)}" print(error_msg) print(error_msg, file=logfile) # 异常时返回None,更清晰区分失败和有效响应 return None
关键改动点说明
- 优化异常返回值:把
get_data()异常时的返回值从False改为None,这样在主循环里能更明确地判断是否拿到了有效响应,避免后续调用json()出错。 - 增加类型校验:主循环里先判断
data是不是requests.Response对象,再执行后续的JSON解析和状态判断,确保只有有效响应才会进入业务逻辑分支。 - 捕获JSON解析异常:新增
ValueError捕获逻辑,防止接口返回非JSON格式内容时抛出异常中断循环。 - 修复日志冗余:原代码里日志打印重复了
str(e),已经修正,避免日志内容混乱。 - 简化函数逻辑:移除了冗余的
survey_found变量,直接返回响应或None,代码更简洁易读。
这样修改后,不管列表里哪个ID出现问题,脚本都会处理完当前ID的错误,然后继续遍历下一个ID,不会中途停止。
内容的提问来源于stack exchange,提问作者alim1990
相关产品推荐
相关产品推荐

