【问题标题】:How to capture botocore's NoSuchKey exception?如何捕获 botocore 的 NoSuchKey 异常?
【发布时间】:2019-08-22 03:40:13
【问题描述】:

我正在尝试编写“好”的 python 并通过以下方式捕获 S3 no such key 错误:

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 * 也不起作用,我不想捕获一般错误。

【问题讨论】:

  • 对于botocore.errorfactory.NoSuchKey这样的异常,需要通过客户端对象来访问建模异常。所以你需要client.exceptions.NoSuchKey而不是botocore.errorfactory.NoSuchKey

标签: python botocore


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    使用 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"
    

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 使用元信息是我认为最优雅的方式
    【解决方案4】:

    我认为在 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)
    

    object 没有属性“InvalidBucketName”。有效的例外是:BucketAlreadyExists、BucketAlreadyOwnedByYou、NoSuchBucket、NoSuchKey、NoSuchUpload、ObjectAlreadyInActiveTierError、ObjectNotInActiveTierError

    【讨论】:

    • 由于可能不相关的原因,当我以这种方式捕获异常时,它们不会传播。 (?)
    • 如果你把它困住,你就让它沉默。然后你需要像“raise err”一样再次提升它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多