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

Python脚本调用API时如何高效处理KeyError异常?

嗨,这个问题我之前也踩过坑,完全没必要给每个字段都单独写try-except块,分享几个更优雅的解决方案给你:

方案1:使用字典的get()方法(无额外依赖,推荐)

Python字典自带的get()方法可以指定键不存在时的默认值,配合对列表的判断,就能安全处理嵌套字段的缺失:

# 处理address:先获取addresses列表(默认空列表),若列表非空则取第一个元素,再取ip(默认空字符串)
address = asset.get('addresses', [])[0].get('ip', '') if asset.get('addresses') else ''
# 更简洁的写法,用or处理空列表的情况
address = (asset.get('addresses') or [{}])[0].get('ip', '')

# 同理处理hostname
hostname = (asset.get('hostNames') or [{}])[0].get('name', '')

# 处理os字段,直接用get指定默认值
os = asset.get('os', '')

这种方式不需要try-except,直接通过默认值覆盖缺失字段的情况,代码更紧凑。

方案2:编写通用嵌套取值函数(适合复杂多层场景)

如果你的JSON结构嵌套很深,写一堆get()会显得繁琐,可以封装一个通用函数来处理多层嵌套的取值:

def get_nested_value(data, keys, default=''):
    current = data
    for key in keys:
        # 如果当前是列表,先取第一个元素(空列表则用空字典)
        if isinstance(current, list):
            current = current[0] if current else {}
        # 尝试获取当前键,取不到就返回默认值
        current = current.get(key, default)
        # 如果已经拿到默认值,提前退出循环
        if current == default:
            break
    return current

# 使用示例:传参为数据对象和键的路径列表
address = get_nested_value(asset, ['addresses', 'ip'])
hostname = get_nested_value(asset, ['hostNames', 'name'])
os = get_nested_value(asset, ['os'])

这个函数可以轻松处理任意深度的嵌套结构,后续新增字段时直接调用函数即可,维护起来更方便。

方案3:使用第三方库简化属性访问(最简洁)

如果可以引入第三方库,推荐使用python-box,它能让你像访问对象属性一样操作字典,并且自动处理缺失的键:

首先安装库:

pip install python-box

然后使用:

from box import Box

# 将普通字典转为Box对象,default_box=True表示缺失的属性返回空Box(避免报错)
asset_box = Box(asset, default_box=True)

# 直接用属性访问,缺失时返回None,再用or转为空字符串
address = asset_box.addresses[0].ip or ''
hostname = asset_box.hostNames[0].name or ''
os = asset_box.os or ''

这种写法最简洁,代码可读性也最高,适合长期维护的项目。


内容的提问来源于stack exchange,提问作者ExploiterZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:57:44