循环内为REST API加异常处理后触发KeyError报错如何解决
问题根因
你触发KeyError的核心原因是:现有异常处理逻辑仅覆盖了网络请求本身的异常(比如超时、断网、DNS解析失败等场景),但没有覆盖API正常返回错误响应的情况——比如你日志里的认证错误,此时API返回的JSON结构里没有items字段,你直接访问results['items']就会抛出异常中断循环。
另外现有代码还有两个隐藏问题:
- 请求异常触发
except分支后,没有跳过后续字段读取逻辑,仍会执行访问items的代码 - 没有校验HTTP响应状态码,4xx、5xx类的服务端/客户端错误默认不会被
requests的RequestException捕获
修复方案
调整逻辑将结果解析部分全部放在请求成功的分支中,同时用安全方法读取字典字段,所有异常场景做兜底处理保证循环不中断,修正后的代码如下:
import requests iter_len = len(addresses) for q in range(iter_len): geocode_url = f"https://geocode.search.hereapi.com/v1/geocode?q={addresses[q]}&apikey=###" try: results = requests.get(geocode_url) print('THIS IS THE CURRENT URL:', geocode_url) # 主动校验HTTP状态码,4xx/5xx错误直接抛出异常 results.raise_for_status() except requests.exceptions.RequestException as err: # 异常场景兜底写入空值,直接进入下一轮循环 print(f"请求失败: {repr(err)}") output = ('NULL','NULL','NULL','NULL',addresses[q]) append_list_as_row(output_filename, output) continue # 走到此处说明请求已成功,解析返回JSON res_json = results.json() print('DICTIONARY RESULTS:', res_json) # 用get方法安全读取items字段,不存在时默认返回空列表 items = res_json.get('items', []) if not items: output = ('NULL','NULL','NULL','NULL',addresses[q]) append_list_as_row(output_filename, output) continue # 正常解析返回结果 output = ( items[0]['position']['lat'], items[0]['position']['lng'], items[0]['address']['countryCode'], items[0]['address']['countryName'], addresses[q] ) print('GEOCODED LIST:', output) append_list_as_row(output_filename, output)
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

