首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确捕获boto3错误

正确捕获boto3错误
EN

Stack Overflow用户
提问于 2017-09-12 18:46:09
回答 2查看 19.5K关注 0票数 31

我正在开发一个django应用程序,可以与几个亚马逊网络服务进行通信。

到目前为止,我在处理和捕获boto3客户端抛出的异常时遇到了麻烦。我正在做的事情似乎不必要地单调乏味:

示例:

代码语言:javascript
复制
client = boto3.client('sns')
client.create_platform_endpoint(PlatformApplicationArn=SNS_APP_ARN, Token=token)

例如,如果令牌不好,这可能会抛出botocore.errorfactory.InvalidParameterException

代码语言:javascript
复制
client.get_endpoint_attributes(EndpointArn=endpoint_arn)

可能会抛出botocore.errorfactory.NotFoundException

首先,我在代码中找不到这些错误,所以它们可能是在某个地方生成的。底线:我不能像往常一样导入并捕获它。

其次,我找到了一种捕获错误here的方法,使用:

代码语言:javascript
复制
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客户端对象:

代码语言:javascript
复制
try:
    # boto3 stuff
except client.exceptions.NotFoundException as e:
    # handle exception

这似乎是到目前为止最干净的方法。但是,我并不总是将boto3客户机对象放在我想要捕获错误的地方。此外,我仍然只是尝试一些东西,所以这主要是猜测工作。

有人知道应该如何处理boto3错误吗?

或者可以给我一些连贯的文档,其中提到了上面的错误?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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上仍然可以很容易地使用低级客户端,因此您可以像这样处理异常:

代码语言:javascript
复制
try:
    my_service_resource.do_stuff()
except my_service_resource.meta.client.exceptions.NotFoundException as e:
    # handle exception
票数 15
EN

Stack Overflow用户

发布于 2019-09-23 20:08:00

使用Boto3异常:https://www.programcreek.com/python/example/97944/boto3.exceptions

代码语言:javascript
复制
client = boto3.client('logs')
try:
   client.create_log_group(logGroupName=LOG_GROUP)
except client.exceptions.ResourceAlreadyExistsException:
   pass
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46174385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档