Как управлять ошибками API Google в Python

В настоящее время я делаю много вещей с BigQuery, и я использую много try... except.... Похоже, что каждая ошибка, которую я возвращаю из BigQuery, - это apiclient.errors.HttpError, но с разными строками, прикрепленными к ним, то есть:

<HttpError 409 when requesting https://www.googleapis.com/bigquery/v2/projects/some_id/datasets/some_dataset/tables?alt=json returned "Already Exists: Table some_id:some_dataset.some_table">

<HttpError 404 when requesting https://www.googleapis.com/bigquery/v2/projects/some_id/jobs/sdfgsdfg?alt=json returned "Not Found: Job some_id:sdfgsdfg">

среди многих других. Прямо сейчас единственный способ, с помощью которого я обращаюсь, это запустить регулярные выражения в сообщениях об ошибках, но это грязно и определенно не идеально. Есть ли лучший способ?

Ответ 1

BigQuery - это REST API, ошибки, которые он использует, следуют стандартным соглашениям об ошибках HTTP.

В python в HttpError есть поле resp.status, которое возвращает код состояния HTTP. Как показано выше, 409 - это "конфликт", 404 "не найден".

Например:

from googleapiclient.errors import HttpError
try:
   ...
except HttpError as err:
  # If the error is a rate limit or connection error,
  # wait and try again.
  if err.resp.status in [403, 500, 503]:
    time.sleep(5)
  else: raise

Ответ также является json-объектом, еще лучший способ - проанализировать json и прочитать поле причины ошибки:

if err.resp.get('content-type', '').startswith('application/json'):
    reason = json.loads(e.content).reason

Это может быть: notFound, duplicate, accessDenied, invalidQuery, backendError, resourcesExceeded, invalid, quotaExceeded, rateLimitExceeded, timeout и т.д.