Python boto3异常处理

Python boto3异常处理,python,python-3.x,amazon-web-services,exception,boto3,Python,Python 3.x,Amazon Web Services,Exception,Boto3,我想创建一个具有多个属性的S3存储桶: def create_s3_bucket(名称): s3Client=boto3.client('s3') 尝试: s3Client.create_bucket( Bucket=名称, ACL=“private”, CreateBucketConfiguration={ “位置约束”:“eu-central-1”, }, ) 除ClientError作为e外: 打印(e) 尝试: s3Client.put\u public\u access\u块( Buc

我想创建一个具有多个属性的S3存储桶:

def create_s3_bucket(名称):
s3Client=boto3.client('s3')
尝试:
s3Client.create_bucket(
Bucket=名称,
ACL=“private”,
CreateBucketConfiguration={
“位置约束”:“eu-central-1”,
},
)
除ClientError作为e外:
打印(e)
尝试:
s3Client.put\u public\u access\u块(
Bucket=名称,
PublicAccessBlockConfiguration={
“BlockPublicAcls”:正确,
“IgnorePublicAcls”:True,
“BlockPublicPolicy”:正确,
“RestrictPublicBucket”:True
}
)
除ClientError作为e外:
打印(e)
尝试:
s3Client.put_bucket_版本控制(
Bucket=名称,
版本配置={
“状态”:“已启用”
}
)
除ClientError作为e外:
s3Client.put_bucket_标记(
Bucket=名称,
标记={
“标记集”:[
{
'Key':'firstTag',
“值”:“firstValue”
},
]
}
)
除ClientError作为e外:
打印(e)
到目前为止,这是可行的。 我的问题是:有没有更好、更优雅的方法来处理ClientError,因为我一直在代码中重复自己?
如果我将每个API调用放在一个try-catch块中,那么可能会出现一个调用不发生事件的情况。

您可以将所有这些放在同一个try块中,这将最终阻止它尝试无法执行的函数(即,从未创建过bucket)

如果引发异常,它应该返回打印以外的内容来标识此失败,以防止函数调用方继续执行逻辑

此外,在异常语句中,如果bucket已创建但无法继续,则可以回滚

此代码可能如下所示

def create_s3_bucket(name):
    s3Client = boto3.client('s3')

    try:
        s3Client.create_bucket(
            Bucket=name,
            ACL="private",
            CreateBucketConfiguration={
                'LocationConstraint': 'eu-central-1',
            },
        )

        s3Client.put_public_access_block(
            Bucket=name,
            PublicAccessBlockConfiguration={
                'BlockPublicAcls': True,
                'IgnorePublicAcls': True,
                'BlockPublicPolicy': True,
                'RestrictPublicBuckets': True
            }
        )

        s3Client.put_bucket_versioning(
            Bucket=name,
            VersioningConfiguration={
                'Status': 'Enabled'
            }
        )

        s3Client.put_bucket_tagging(
            Bucket=name,
            Tagging={
                'TagSet': [
                    {
                        'Key': 'firstTag',
                        'Value': 'firstValue'
                    },
                ]
            }
        )
    except ClientError as e:
        print(e)
        #Do some tidy up (delete bucket or notify)
        return false

    return true


如果
create\u bucket
失败,
put\u public\u access\u block
将如何工作?你需要具体说明你的程序在错误情况下的行为。我需要说明我的问题:如果bucket(例如)已经存在,那么它会抛出一个异常。但是这应该可以防止将bucket属性与后续API调用放在一起。如果您想检查bucket是否存在并完成您的函数,为什么不在bucket不存在时返回它呢?好的,这对我有帮助:)但是我不明白代码中返回的目的。我在文档中也看到了这个返回语句,但没有进一步解释。在这种情况下,他们的目的是什么?很高兴这能有所帮助:)