web-dev-qa-db-ja.com

botocoreのNoSuchKey例外をキャプチャする方法は?

私は「良い」pythonを書き、これでS3 no such keyエラーをキャプチャしようとしています:

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"

ただし、NoSuchKeyは定義されていないため、定義する必要があるインポートまでトレースできません。

e.__class__botocore.errorfactory.NoSuchKeyですが、from botocore.errorfactory import NoSuchKeyはエラーになり、from botocore.errorfactory import *も機能せず、一般的なエラーをキャプチャしたくありません。

62
theist
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
75
Jose Alban

Botocore 1.5を使用すると、クライアントハンドルが例外クラスを公開しているように見えます。

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

Boto3では、リソースのメタクライアントの例外にアクセスできました。

import boto3

s3 = boto3.resource('s3')
s3_object = s3.Object(bucket_name, key)

try:
    content = s3_object.get()['Body'].read().decode('utf-8')
except s3.meta.client.exceptions.NoSuchKey:
    print("no such key in bucket")
11
Randy

これを行う最もエレガントな方法は、Boto3

session = botocore.session.get_session()
client = session.create_client('s3')

try:
    client.get_object(Bucket=BUCKET, Key=FILE)
except client.exceptions.NoSuchKey:
    print("no such key in bucket")

エラー処理に関するドキュメントはまばらであるように見えますが、以下は、これが機能するエラーコードを出力します。

session = botocore.session.get_session()
client = session.create_client('s3')
try:
    try:
        client.get_object(Bucket=BUCKET, Key=FILE)
    except client.exceptions.InvalidBucketName:
        print("no such key in bucket")
except AttributeError as err:
    print(err)

<0x105e08c50のbotocore.errorfactory.S3Exceptionsオブジェクト>オブジェクトには属性「InvalidBucketName」がありません。有効な例外は、BucketAlreadyExists、BucketAlreadyOwnedByYou、NoSuchBucket、NoSuchKey、NoSuchUpload、ObjectAlreadyInActiveTierError、ObjectNotInActiveTierErrorです。

10
JeffSolo