Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Manage Google API Errors in Python

I'm currently doing a lot of stuff with BigQuery, and am using a lot of try... except.... It looks like just about every error I get back from BigQuery is a apiclient.errors.HttpError, but with different strings attached to them, i.e.:

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

among many others. Right now the only way I see to handle these is to run regexs on the error messages, but this is messy and definitely not ideal. Is there a better way?

like image 247
Eli Avatar asked May 30 '14 01:05

Eli


People also ask

How do I fix an API error?

To fix this, check with your API provider to see if there is a testing environment that doesn't utilize caching. Alternatively, double check your API call on a different machine or with a different set of credentials. You can also check your API documentation to see if there's some cache invalidation method available.

What is Google API Python client?

Google API Client. This is the Google API Python client library for Google's discovery based APIs. To get started, please see the docs folder. This library is considered complete and is in maintenance mode. This means that we will address critical bugs and security issues but will not add any new features.


2 Answers

BigQuery is a REST API, the errors it uses follow standard HTTP error conventions.

In python, an HttpError has a resp.status field that returns the HTTP status code. As you show above, 409 is 'conflict', 404 is 'not found'.

For example:

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 

The response is also a json object, an even better way is to parse the json and read the error reason field:

if err.resp.get('content-type', '').startswith('application/json'):     reason = json.loads(err.content).get('error').get('errors')[0].get('reason') 

This can be: notFound, duplicate, accessDenied, invalidQuery, backendError, resourcesExceeded, invalid, quotaExceeded, rateLimitExceeded, timeout, etc.

like image 115
Jordan Tigani Avatar answered Oct 05 '22 23:10

Jordan Tigani


Google Cloud now provides exception handlers:

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

This should prove more exact in catching the details of the error.

Please reference this source code to find other exceptions to utilize: http://google-cloud-python.readthedocs.io/en/latest/_modules/google/api_core/exceptions.html

like image 28
Justin C. Avatar answered Oct 06 '22 01:10

Justin C.