如何捕获botocore的NoSuchKey异常?

the*_*ist 68 python botocore

我正在尝试编写"好"的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"
Run Code Online (Sandbox Code Playgroud)

但NoSuchKey没有定义,我无法将其跟踪到我需要定义的导入.

e.__class__botocore.errorfactory.NoSuchKey,但from botocore.errorfactory import NoSuchKey给出了一个错误,from botocore.errorfactory import *也不管用,我不希望捕捉一般错误.

Jos*_*ban 85

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
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这种技术(检查 error.response 字典),因为与替代的“client.exceptions.NoSuchKey”技术相比,它对类型更加友好;python类型系统不知道后者的类结构。我知道一些附加类型注释解决方案,但我也不喜欢这种方法,它太辛苦了。 (3认同)

小智 32

使用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"
Run Code Online (Sandbox Code Playgroud)

  • 如果您忘记像我一样滚动:如果您使用高级资源(`s3 = boto3.resource(“s3”)`),您可以通过`s3.meta.client访问客户端,从而访问异常。异常。NoSuchKey`。请参阅/sf/ask/2700702581/ (4认同)

Ran*_*ndy 14

在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")
Run Code Online (Sandbox Code Playgroud)


Jef*_*olo 12

我认为最优雅的方式是在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")
Run Code Online (Sandbox Code Playgroud)

有关错误处理的文档似乎很少,但以下内容会打印出错误代码:

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)
Run Code Online (Sandbox Code Playgroud)

<botocore.errorfactory.S3Exceptions对象位于0x105e08c50>对象没有属性'InvalidBucketName'.有效的例外有:BucketAlreadyExists,BucketAlreadyOwnedByYou,NoSuchBucket,NoSuchKey,NoSuchUpload,ObjectAlreadyInActiveTierError,ObjectNotInActiveTierError