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

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}')

为什么这样能解决你的需求?

  1. 精准捕获目标异常:用except HttpError as err:直接捕获Google API抛出的特定异常,不会误捕其他无关异常
  2. 跳过错误邮箱:当捕获到404错误(邮箱不存在/日历未找到)时,打印提示后程序会直接进入finally块,然后继续循环下一个邮箱,不会中断整个程序
  3. 保留有效结果:有效邮箱的事件会正常被获取、处理,最终输出对应的事件列表和PTO统计

另外要注意:Google Calendar API的list方法的calendarId参数不接受列表,只能传入单个日历ID,所以你最上方那段直接传列表的代码是无效的,记得删掉它。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:01:31