Google 工作表 API:异常与响应正文中的 Json

Google Sheets API: Exception vs. Json in response body

我迷失在 Google 工作表 API 的错误处理中。

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

这个 指向一个文档页面说:

The Drive API returns two levels of error information:

HTTP error codes and messages in the header.

A JSON object in the response body with additional details that can help you determine how > to handle the error.

Drive apps should catch and handle all errors that might be encountered when using the REST > API. This guide provides instructions on how to resolve specific API errors.

然后列出 json 对 404

的响应示例

然而,当我 运行 使用不存在的 spreadsheet_id 以下代码时(它在正确的 spreadsheet_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 并捕获真正的技术错误的异常,例如连接不良等

提前致谢!

“未找到请求的实体”错误通常是由于发送了无效的传播sheetId。

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

我认为您的目标和现状如下。

  • 当工作表 API 发生错误时,您想从工作表 API 中检索错误消息作为 JSON 数据。
  • 您想使用带有 python 的 googleapis 来实现此目的。
  • 您已经能够通过 googleapis python 使用 Google 表格 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 可用于使用表格 API 从 Google 电子表格中检索值。请注意这一点。

参考: