2014-05-30 22 views
10

Tôi hiện đang làm rất nhiều thứ với BigQuery và đang sử dụng rất nhiều try... except.... Dường như chỉ là về mọi lỗi tôi nhận lại từ BigQuery là một apiclient.errors.HttpError, nhưng với chuỗi khác nhau gắn liền với chúng, tức là .:Cách quản lý lỗi Google API bằng 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">

trong số rất nhiều người khác. Ngay bây giờ, cách duy nhất tôi thấy để xử lý chúng là chạy regex trên các thông báo lỗi, nhưng điều này là lộn xộn và chắc chắn không lý tưởng. Có cách nào tốt hơn?

+0

Dường như Ngoại lệ có một vài [bổ sung các thuộc tính] (https://code.google.com/p/google-api-python-client/source/browse/apiclient/errors.py#35) mà bạn có thể dựa vào - Cụ thể, bạn có thể (cố gắng) phân tích cú pháp JSON từ 'error.content' và làm việc với điều đó. – mgilson

Trả lời

10

BigQuery là REST API, lỗi mà nó sử dụng tuân theo quy ước lỗi HTTP chuẩn.

Trong trăn, một HttpError có trường resp.status trả về mã trạng thái HTTP. Khi bạn hiển thị ở trên, 409 là 'xung đột', 404 là 'không tìm thấy'.

Ví dụ:

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 

Câu trả lời cũng là một đối tượng json, một cách tốt hơn là phân tích những json và đọc các lĩnh vực lý do lỗi:

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

này có thể là: notFound, duplicate, accessDenied, invalidQuery, backendError, resourcesExceeded, invalid, quotaExceeded, rateLimitExceeded, timeout, v.v.

Các vấn đề liên quan