How to capture botocore's NoSuchKey exception?
I'm trying to write "good" python and capture a S3 no such key error with this:
session = botocore.session.get_session()
client = session.create_client('s3')
try:
client.get_object(Bucket=BUCKET, Key=FILE)
except NoSuchKey as e:
print >> sys.stderr, "no such key in bucket"
But NoSuchKey isn't defined and I can't trace it to the import I need to have it defined.
e.__class__
is botocore.errorfactory.NoSuchKey
but from botocore.errorfactory import NoSuchKey
gives an error and from botocore.errorfactory import *
doesn't work either and I don't want to capture a generic error.
Solution 1:
from botocore.exceptions import ClientError
try:
response = self.client.get_object(Bucket=bucket, Key=key)
return json.loads(response["Body"].read())
except ClientError as ex:
if ex.response['Error']['Code'] == 'NoSuchKey':
logger.info('No object found - returning empty')
return dict()
else:
raise
Solution 2:
Using botocore 1.5, it looks like the client handle exposes the exception classes:
session = botocore.session.get_session()
client = session.create_client('s3')
try:
client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey as e:
print >> sys.stderr, "no such key in bucket"