我正在开发一个django应用程序,可以与几个亚马逊网络服务进行通信。
到目前为止,我在处理和捕获boto3客户端抛出的异常时遇到了麻烦。我正在做的事情似乎不必要地单调乏味:
示例:
client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)例如,如果令牌不好,这可能会抛出botocore.errorfactory.InvalidParameterException。
client.get_endpoint_attributes(EndpointArn=endpoint_arn)可能会抛出botocore.errorfactory.NotFoundException。
首先,我在代码中找不到这些错误,所以它们可能是在某个地方生成的。底线:我不能像往常一样导入并捕获它。
其次,我找到了一种捕获错误here的方法,使用:
try:
# boto3 stuff
except botocore.exceptions.ClientError as e:
if e.response['Error']['Code'] == 'NotFound':
# handle exception
else:
raise e但我必须删除错误名称中的Exception部分。看起来非常随机,我不知道如果我想要捕获它,我是否会删除botocore.exceptions.ParamValidationError中的Error。所以很难一概而论。
另一种捕获错误的方法是使用我获得的boto3客户端对象:
try:
# boto3 stuff
except client.exceptions.NotFoundException as e:
# handle exception这似乎是到目前为止最干净的方法。但是,我并不总是将boto3客户机对象放在我想要捕获错误的地方。此外,我仍然只是尝试一些东西,所以这主要是猜测工作。
有人知道应该如何处理boto3错误吗?
或者可以给我一些连贯的文档,其中提到了上面的错误?谢谢
发布于 2018-03-24 02:52:40
你已经很好地总结了情况。旧的boto有一种简单的硬编码方法来支持AWS API。boto3似乎试图减少使Python客户端与各种apis上不断发展的特性保持同步的开销,但它对异常的处理更为笨拙,所以您上面概述的ClientError方法曾经是规范的方法。
在2017年,他们引入了你强调的第二种机制:客户端可用的“模型化”异常。
我不熟悉社交网络,但在我使用其他亚马逊网络服务产品的经验中,ClientError命名与HTTP相匹配,这往往有很好的文档记录。因此我将从这里开始:https://docs.aws.amazon.com/sns/latest/api/Welcome.html
看起来新型的建模异常是从botocore模块中的服务定义文件中生成的。我找不到任何关于它的文档,但是去浏览一下https://github.com/boto/botocore/tree/master/botocore/data中的亚马逊网络服务模型。
此外,如果您不是直接处理低级客户端(与OP的代码相反),而是使用高级AWS ServiceResource对象,那么在my_service_resource.meta.client上仍然可以很容易地使用低级客户端,因此您可以像这样处理异常:
try:
my_service_resource.do_stuff()
except my_service_resource.meta.client.exceptions.NotFoundException as e:
# handle exception发布于 2019-09-23 20:08:00
使用Boto3异常:https://www.programcreek.com/python/example/97944/boto3.exceptions
client = boto3.client('logs')
try:
client.create_log_group(logGroupName=LOG_GROUP)
except client.exceptions.ResourceAlreadyExistsException:
passhttps://stackoverflow.com/questions/46174385
复制相似问题