botocore의 NoSuchKey 예외를 캡처하는 방법은 무엇입니까?


106

나는 "좋은"파이썬을 작성하고 이것으로 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.NoSuchKey하지만 from botocore.errorfactory import NoSuchKey오류를 제공하고 from botocore.errorfactory import *중 하나가 작동하지 않습니다와 나는 일반 오류를 캡처하고 싶지 않아요.

답변:


129
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를 사용하면 클라이언트 핸들이 예외 클래스를 노출하는 것처럼 보입니다.

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에서 몇 가지 의견을 찾을 수 있습니다. github.com/boto/boto3/issues/1262#issuecomment-329314670
Sylwester

나처럼 스크롤하는 것을 잊은 경우 : 상위 수준 리소스 ( s3 = boto3.resource("s3"))를 사용하는 경우 클라이언트에 액세스 할 수 있으므로 s3.meta.client.exceptions.NoSuchKey. stackoverflow.com/questions/38581465/…
lorey

34

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

메타 정보를 사용하는 것은 내 의견에 가장 우아한 방법입니다
Tanja Bayer

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 object at 0x105e08c50> object has no attribute 'InvalidBucketName'. 유효한 예외는 다음과 같습니다. BucketAlreadyExists, BucketAlreadyOwnedByYou, NoSuchBucket, NoSuchKey, NoSuchUpload, ObjectAlreadyInActiveTierError, ObjectNotInActiveTierError


관련이없는 이유 때문에 이런 방식으로 예외를 트랩하면 전파되지 않습니다. (?)
Everett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.