2014-05-30 9 views
10

Ich mache gerade eine Menge Sachen mit BigQuery und verwende eine Menge try... except.... Es sieht aus wie fast jeder Fehler, den ich zurück von BigQuery bekommen, ist eine apiclient.errors.HttpError, aber mit verschiedenen Saiten zu ihnen angebracht werden, d.h .:So verwalten Sie Google API-Fehler in Python

<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">

unter vielen anderen. Momentan ist die einzige Möglichkeit, die ich damit umgehen kann, das Ausführen von Regexs auf den Fehlermeldungen, aber das ist chaotisch und definitiv nicht ideal. Gibt es einen besseren Weg?

+0

Es sieht so aus, als hätte die Exception ein paar [zusätzliche Attribute] (https://code.google.com/p/google-api-python-client/source/browse/apiclient/errors.py#35), auf die Sie sich verlassen könnten - Insbesondere könnten Sie (versuchen Sie es) parse den JSON aus dem 'error.content' und arbeite damit. – mgilson

Antwort

10

BigQuery ist eine REST-API. Die verwendeten Fehler entsprechen den standardmäßigen HTTP-Fehlerkonventionen.

In Python hat ein HttpError ein Feld resp.status, das den HTTP-Statuscode zurückgibt. Wie Sie oben zeigen, 409 ist "Konflikt", 404 ist "nicht gefunden".

Zum Beispiel:

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 

Die Antwort wird auch ein JSON-Objekt, eine noch bessere Möglichkeit ist es, die json zu analysieren und die Fehlerursache Feld zu lesen:

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

das sein kann: notFound, duplicate, accessDenied, invalidQuery, backendError, resourcesExceeded, invalid, quotaExceeded, rateLimitExceeded, Timeout usw.

Verwandte Themen