Botocore'un NoSuchKey istisnası nasıl yakalanır?


105

"İyi" python yazmaya ve bununla bir S3 yakalamaya çalışıyorum böyle bir anahtar hatası yok:

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"

Ancak NoSuchKey tanımlı değil ve onu tanımlamam gereken içe aktarmaya kadar izleyemiyorum.

e.__class__olduğunu botocore.errorfactory.NoSuchKeyancak from botocore.errorfactory import NoSuchKeybir hata verir ve from botocore.errorfactory import *ya çalışmıyor ve ben genel bir hatayı yakalamak istemiyorum.

Yanıtlar:


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

52

Botocore 1.5 kullanıldığında, istemci tanıtıcısı istisna sınıflarını açığa çıkarıyor gibi görünür:

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"

Daha yeni ve daha az genel olduğu için bunu tercih ediyorum. GitHub'da bu yöntemle ilgili bazı yorumları bulabilirsiniz: github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester Kardziejonek

Benim gibi kaydırmayı unuttuysanız: Yüksek seviyeli kaynağı ( s3 = boto3.resource("s3")) kullanıyorsanız, istemciye ve dolayısıyla İstisna'ya erişebilirsiniz s3.meta.client.exceptions.NoSuchKey. Stackoverflow.com/questions/38581465/… sayfasına
lorey

32

Boto3'te kaynağın meta istemcisindeki istisnaya erişebildim.

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

Meta bilgiyi kullanmak benim opioionumda en zarif yol
Tanja Bayer

24

Bence bunu yapmanın en zarif yolu Boto3'te

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

Hata işlemeyle ilgili belgeler seyrek görünmektedir, ancak aşağıda bunun işe yaradığı hata kodları yazdırılır:

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 nesnesi, 0x105e08c50> nesnesinin 'InvalidBucketName' özniteliği yok. Geçerli istisnalar şunlardır: BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


İlgisiz olabilecek nedenlerden dolayı, İstisnaları bu şekilde tuzağa düşürdüğümde, bunlar yayılmıyor. (?)
Everett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.