Google Calendar API错误处理:跳过无效邮箱继续执行
解决Google Calendar API异常捕获:跳过错误邮箱继续执行
首先明确说:你的try-except块是不正确的,核心问题出在异常类型的指定上,下面一步步给你梳理问题和修复方案:
核心问题:异常捕获的写法错误
你写的except exception as err:有两个明显问题:
- Python的异常类名需要首字母大写,也就是
Exception,但这是捕获所有异常的通用写法,而我们需要精准捕获Google API抛出的HttpError - 你虽然导入了
googleapiclient.errors.HttpError,但没有在except分支里指定这个具体的异常类型,导致目标异常没有被捕获,还是会直接抛出
额外的代码冗余/错误点
看你提供的代码片段,最上方有一段和主循环无关的代码(直接把calendarId设为列表的调用),还有分页处理的逻辑也有问题(比如用events.get('items')但前面events已经是从eventsResult取出的items列表了),这些可以清理掉,避免干扰主逻辑。
修复后的完整代码实现
首先确保你已经正确导入了需要的异常类:
from googleapiclient.errors import HttpError
然后修改循环处理每个邮箱的逻辑,精准捕获HttpError,并且可以通过状态码判断是否是邮箱不存在导致的404错误,这样处理更精准:
# 假设你已经完成了service初始化、calendar_ids/start_date/end_date的定义 for calendar_id in calendar_ids: count = 0 print(f'\n----{calendar_id}:\n') try: eventsResult = service.events().list( calendarId=calendar_id, timeMin=start_date, timeMax=end_date, singleEvents=True, orderBy='startTime').execute() events = eventsResult.get('items', []) if not events: print('No upcoming events found.') for event in events: if 'summary' in event: if 'PTO' in event['summary']: count += 1 start = event['start'].get('dateTime', event['start'].get('date')) print(start, event['summary']) except HttpError as err: # 只处理邮箱不存在的404错误,其他API错误可以按需处理 if err.resp.status == 404: print(f"跳过错误邮箱 {calendar_id}: 未找到对应的日历(错误码404)") else: print(f"处理 {calendar_id} 时遇到API错误: {err}") finally: print(f'Total days off for {calendar_id} is {count}')
为什么这样能解决你的需求?
- 精准捕获目标异常:用
except HttpError as err:直接捕获Google API抛出的特定异常,不会误捕其他无关异常 - 跳过错误邮箱:当捕获到404错误(邮箱不存在/日历未找到)时,打印提示后程序会直接进入finally块,然后继续循环下一个邮箱,不会中断整个程序
- 保留有效结果:有效邮箱的事件会正常被获取、处理,最终输出对应的事件列表和PTO统计
另外要注意:Google Calendar API的list方法的calendarId参数不接受列表,只能传入单个日历ID,所以你最上方那段直接传列表的代码是无效的,记得删掉它。
内容的提问来源于stack exchange,提问作者user11862294
相关产品推荐
相关产品推荐

