You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

循环内为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:15:07