2014-05-30 10 views
10

Şu anda BigQuery ile çok fazla şey yapıyorum ve çok fazla try... except... kullanıyorum. Bu geri BigQuery'ye aldığım hemen her hata gibi .: Bir apiclient.errors.HttpError olduğunu, ancak bunların bağlı farklı dizeleri ile yani görünüyor diğerleri arasındaPython'da Google API Hataları Nasıl Yönetilir

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

. Şu anda bunları ele almak için gördüğüm tek yol, hata iletilerinde regex'leri çalıştırmaktır, ancak bu karmaşık ve kesinlikle ideal değildir. Daha iyi bir yolu var mı?

+0

İstisna bir kaç ek var gibi görünüyor (https://code.google.com/p/google-api-python-client/source/browse/apiclient/errors.py#35) güvenebileceğiniz özellikler. - Özellikle, (deneyebilirsiniz) JSON'u error.content'den ayrıştırın ve bununla çalışın. – mgilson

cevap

10

BigQuery bir REST API'sıdır, kullandığı hatalar standart HTTP hata kurallarına uygundur.

Python'da, bir HttpError, HTTP durum kodunu döndüren bir resp.status alanına sahiptir. Yukarıda gösterildiği gibi, 409 'çakışma', 404 'bulunamadı'.

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 
tepkisi daha da iyi bir yoldur json ayrıştırmak ve hata nedeni alanını okumak için bir json nesnesidir da olduğu

:

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

Bu olabilir: Örneğin

notFound, duplicate, accessDenied, invalidQuery, backendError, resourcesExceeded, geçersiz, quotaExceeded, rateLimitExceeded, zaman aşımı, vb.