【问题标题】:Google Sheets API: Exception vs. Json in response bodyGoogle Sheets API:响应正文中的异常与 Json
【发布时间】:2021-05-21 05:12:10
【问题描述】:

我迷失在 Google Sheets API 的错误处理中。

Sheets API reference page 没有提供任何错误处理示例。

这个SO question 指向一个文档页面:

Drive API 返回两级错误信息:

HTTP error codes and messages in the header.

响应正文中的 JSON 对象,其中包含可帮助您确定如何处理错误的其他详细信息。

云端硬盘应用应捕获并处理使用 REST > API 时可能遇到的所有错误。本指南提供有关如何解决特定 API 错误的说明。

然后列出404的json响应示例

但是,当我使用不存在的电子表格 ID 运行以下代码时(它在正确的电子表格 ID 上运行良好):

request = service.spreadsheets().get(
            spreadsheetId=spreadsheet_id,
            ranges=ranges,
    )

response = request.execute()

我收到一个异常,而不是 json 响应中的错误:

  File ".../lib/python3.8/site-packages/googleapiclient/http.py", line 915, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 404 when requesting https://sheets.googleapis.com/v4/spreadsheets/1Z2aQvO122lBxHyditlDT6KhSAqkiUeX8zqJ4ysIJHd?alt=json returned "Requested entity was not found.". Details: "Requested entity was not found.">

如果不解析字符串,我什至无法提取错误代码。

所以,问题是:如何正确处理工作表 api 错误?我想我更愿意始终获取 json 并捕获真正技术错误的异常,例如连接不良等。

提前致谢!

【问题讨论】:

  • 你得到一个异常引发并且异常结构包含 json

标签: python google-api google-drive-api google-sheets-api google-api-python-client


【解决方案1】:

我相信你的目标和你目前的情况如下。

  • 当 Sheets API 发生错误时,您希望从 Sheets API 中检索错误消息作为 JSON 数据。
  • 您希望使用 googleapis 和 python 来实现这一点。
  • 您已经能够通过 googleapis for python 使用 Sheets API。

在这种情况下,使用 try, except 怎么样?示例脚本如下。

示例脚本:

from googleapiclient.errors import HttpError # <--- In this case, please add this.

try:

    # This is your script.
    request = service.spreadsheets().get(
        spreadsheetId=spreadsheet_id,
        ranges=ranges,
    )

    response = request.execute()
    print(response)

except HttpError as err:
    e = json.loads(err.content.decode("utf-8"))
    print(e)
  • 在此示例脚本中,当spreadsheet_id 为有效值时,返回值可以用print(response) 看到。当spreadsheet_id 是无效值时,可以使用print(e) 看到错误消息。 print(e)的样本值如下。

      {'error': {'status': 'NOT_FOUND', 'message': 'Requested entity was not found.', 'code': 404, 'errors': [{'domain': 'global', 'message': 'Requested entity was not found.', 'reason': 'notFound'}]}}
    

注意:

  • 在此示例脚本中,它假设您的service 可用于使用 Sheets API 从 Google 电子表格中检索值。请注意这一点。

参考:

【讨论】:

  • 感谢您的示例,现在很清楚,错误代码和消息带有异常对象。看到许多其他服务仅在响应本身中返回错误代码和消息的异常只是令人困惑。即与requests 库进行比较。无论如何,再次感谢。
  • @Artem Trunov 感谢您的回复。很高兴您的问题得到解决。
【解决方案2】:

“未找到请求的实体”错误通常是由发送无效的电子表格 ID 引起的。

您应该首先检查您已通过身份验证的用户是否确实有权访问工作表。做一个 file.list 并搜索 mime 类型的工作表将是一个很好的方法try me

【讨论】:

  • 是的,我故意尝试了一个无效的 id 以查看错误响应的样子。我更具体的问题是为什么我没有从 google API 获得带有 404 代码的 json 响应,而是一个 http 异常?我想我只需要关于如何处理错误的指导。
  • 好吧,我没有制作 api,但由于 id 不存在实际上会使以下链接 404 sheets.googleapis.com/v4/spreadsheets/… 因为它不存在。所以它会抛出一个 HTTP 错误是有道理的。
猜你喜欢
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 2015-06-03
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多