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


105

私は「良い」Pythonを書いて、これでそのようなキーエラーのないS3をキャプチャしようとしています:

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.NoSuchKeyfrom botocore.errorfactory import NoSuchKey、エラーが発生し、from botocore.errorfactory import *どちらも機能しません。一般的なエラーをキャプチャしたくありません。

回答:


127
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

51

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"

これは新しく、一般的でもないので、私はこれを選びます。このメソッドに関するGitHubに関するコメントは、次のとおり
Sylwester Kardziejonek 2018年

私のようにスクロールするのを忘れた場合:高レベルのリソース(s3 = boto3.resource("s3"))を使用している場合は、を介してクライアントにアクセスし、例外にアクセスできますs3.meta.client.exceptions.NoSuchKeystackoverflow.com/questions/38581465/を

31

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

24

これを行う最もエレガントな方法は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)

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


関係のない理由で、この方法で例外をトラップすると、例外は伝播されません。(?)
エベレット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.