web-dev-qa-db-ja.com

PythonでGoogleAPIエラーを管理する方法

私は現在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">

他の多くの中で。今のところ、これらを処理する唯一の方法は、エラーメッセージに対してregexを実行することですが、これは面倒で、絶対に理想的ではありません。もっと良い方法はありますか?

19
Eli

BigQueryはREST APIであり、使用するエラーは標準のHTTPエラー規則に従います。

Pythonでは、HttpErrorにはHTTPステータスコードを返すresp.statusフィールドがあります。上に示したように、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(err.content).get('error').get('errors')[0].get('reason')

これには、notFound、duplicate、accessDenied、invalidQuery、backendError、resourcesExceeded、invalid、quotaExceeded、rateLimitExceeded、timeoutなどがあります。

20
Jordan Tigani

GoogleCloudは例外ハンドラーを提供するようになりました。

from google.api_core.exceptions import AlreadyExists, NotFound
try:
    ...
except AlreadyExists:
    ...
except NotFound:
    ...

これは、エラーの詳細を把握する上でより正確であることが証明されるはずです。

利用する他の例外を見つけるには、このソースコードを参照してください: http://google-cloud-python.readthedocs.io/en/latest/_modules/google/api_core/exceptions.html

6
Justin Chavez