Python中存在对应Key却触发KeyError问题求助
解决Zendesk分页时的KeyError问题
看起来你遇到的问题很清晰:第一次请求Zendesk API返回了包含users和next_page的正常响应,但第二次请求直接返回了error字段,这时候你的代码还在尝试访问users键,自然就触发了KeyError。
问题根源
从你打印的dict_keys能明显看到,第二次请求的响应结构完全变了——只有error键,说明这次请求失败了(大概率是API速率限制、权限不足、分页URL失效,或者Zendesk API返回了其他业务错误)。你的代码没有处理这种异常响应的逻辑,才会直接报错。
解决方案
你需要在代码里加入错误检查和容错逻辑,避免直接访问可能不存在的键。这里给你几个具体的改进步骤:
- 先校验请求状态码
Zendesk API成功时会返回200状态码,失败时会返回4xx/5xx类状态码。先判断状态码是否正常,再处理响应内容:
data_users2 = [] # 初始化为空列表更合理,避免后续多一个空列表元素 while url_users: users_pagination = requests.get(url_users, auth=(user, pwd)) # 先检查请求是否成功 if users_pagination.status_code != 200: print(f"请求失败,状态码:{users_pagination.status_code}") print(f"错误详情:{json.loads(users_pagination.text)}") break # 也可以根据情况选择重试或其他处理 data_user_page = json.loads(users_pagination.text) print(data_user_page.keys()) # 确保users键存在再遍历 if 'users' in data_user_page: data_users2.extend(data_user_page['users']) # 用extend比循环append更高效 # 用get方法安全获取next_page,不存在则返回None,循环自动结束 url_users = data_user_page.get('next_page', None)
- 主动处理Zendesk的错误响应
当响应里出现error键时,直接打印错误信息,这样你就能明确知道失败原因(比如速率限制会提示等待时间,权限问题会说明缺少的权限):
data_users2 = [] while url_users: users_pagination = requests.get(url_users, auth=(user, pwd)) data_user_page = json.loads(users_pagination.text) # 优先检查是否有错误 if 'error' in data_user_page: print(f"Zendesk API错误:{data_user_page['error']}") break # 正常处理分页数据 data_users2.extend(data_user_page['users']) url_users = data_user_page.get('next_page')
- 优化初始列表和数据添加逻辑
你原来的data_users2 = [[]]会导致最终列表里第一个元素是空列表,改成data_users2 = []更合适;用extend直接把当前页的用户列表元素批量添加,比循环append单个用户更高效。
额外建议
- 可以查看Zendesk官方API文档,确认分页的规范用法,以及常见错误码对应的解决方法;
- 如果是速率限制问题,可以加入重试机制(比如使用
tenacity库),或者根据响应头里的Retry-After字段等待后再请求; - 确认你的账号
auth信息正确,且拥有访问用户数据的权限。
内容的提问来源于stack exchange,提问作者anonseaotter
相关产品推荐
相关产品推荐

