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.