如何为Google Cloud Identity API添加异常处理以跳过无效群组
问题描述
调用Google Cloud Identity API遍历组织群组获取成员详情时,遇到如下403错误:
return (<HttpError 403 when requesting https://cloudidentity.googleapis.com/v1/groups/040ew0vw43lra72/memberships?view=FULL&alt=json returned "Error(2028): Permission denied for resource groups/040ew0vw43lra72 (or it may not exist).". Details: "Error(2028): Permission denied for resource groups/040ew0vw43lra72 (or it may not exist)."> )
该群组由组织群组列表API返回,但在Google Groups UI中无法查询到。当前代码的异常捕获逻辑会导致整个任务失败,需修改方法使其遇到无效群组时跳过当前迭代,继续处理后续群组。
原代码如下:
def get_membership_data(service, all_group_df): all_member_df = pd.DataFrame() try: for inx, group in all_group_df.iterrows(): print(f'Membership details for group {group["name"]}:') members = ( service.groups() .memberships() .list(parent=group["name"], view="FULL") .execute() ) if "memberships" in members: for member in members["memberships"]: members_df = pd.DataFrame(index=[6]) y = json.dumps(member["preferredMemberKey"]) z = json.loads(y) members_df.insert(0, "preferredMemberKey", z["id"]) ##print(z['id']) members_df.insert(1, "createTime", member["createTime"]) members_df.insert(2, "updateTime", member["updateTime"]) members_df.insert(3, "name", group["name"]) a = json.dumps(group["groupKey"]) b = json.loads(a) members_df.insert(4, "groupKey", b["id"]) ##print(b['id']) members_df.insert(5, "displayName", group["displayName"]) all_member_df = pd.concat( [all_member_df, members_df], ignore_index=True ) else: print("No 'memberships' key found in the API response") except Exception as exc: print(exc) return all_member_df
解决方案
核心问题是异常捕获逻辑被放在了循环外层,单个群组抛出异常会直接终止整个方法。需将异常捕获移至循环内部,针对每个群组的API请求单独处理,确保单个群组失败不影响后续任务。
修改后的代码:
import json import pandas as pd def get_membership_data(service, all_group_df): all_member_df = pd.DataFrame() for inx, group in all_group_df.iterrows(): group_name = group["name"] print(f'Membership details for group {group_name}:') try: # 针对单个群组的API请求单独捕获异常 members = ( service.groups() .memberships() .list(parent=group_name, view="FULL") .execute() ) if "memberships" in members: for member in members["memberships"]: # 优化:无需json序列化再反序列化,直接访问字典键值 preferred_member_id = member["preferredMemberKey"]["id"] group_key_id = group["groupKey"]["id"] # 简化DataFrame创建逻辑 member_data = { "preferredMemberKey": preferred_member_id, "createTime": member["createTime"], "updateTime": member["updateTime"], "name": group_name, "groupKey": group_key_id, "displayName": group["displayName"] } members_df = pd.DataFrame([member_data]) all_member_df = pd.concat([all_member_df, members_df], ignore_index=True) else: print(f"No 'memberships' key found in response for group {group_name}") except Exception as exc: # 捕获异常后打印信息,直接进入下一次循环 print(f"Failed to process group {group_name}: {exc}") continue return all_member_df
关键修改说明:
- 将
try-except移至循环内部,确保单个群组的异常不会终止整个任务 - 添加
continue语句,捕获异常后跳过当前群组,继续处理下一个 - 移除冗余的
json.dumps+json.loads操作,直接通过字典键访问值,提升代码效率 - 简化DataFrame创建方式,用字典直接生成单行数据,替代多次
insert操作,增强可读性
内容的提问来源于stack exchange,提问作者unnest_me
相关产品推荐
相关产品推荐

