正确捕获boto3错误

时间:2017-09-12 10:46:09

标签: django amazon-web-services exception boto3

我正在开发一个与几个亚马逊网络服务进行通信的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部分。似乎非常随机,我不知道如果我想抓住那个Error,我是否会删除botocore.exceptions.ParamValidationError中的try: # boto3 stuff except client.exceptions.NotFoundException as e: # handle exception 。所以很难概括。

另一种捕获错误的方法是使用我得到的boto3客户端对象:

Deployment

这似乎是迄今为止最干净的方式。但我并不总是手头有boto3客户端对象,我想抓住错误。此外,我仍然只是在尝试,所以它主要是猜测工作。

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

或者可以指出一些提及上述错误的连贯文档?感谢

2 个答案:

答案 0 :(得分:4)

您已经很好地总结了这种情况。旧的boto有一个简单的硬编码方法来支持AWS API。 boto3,似乎是试图减少使Python客户端与各种apis上的不断发展的功能同步的开销,在异常情况下更加松软,因此上面概述的ClientError方法曾经是规范的方式

2017年,他们推出了你强调的第二种机制:'建模'客户可以使用的例外情况。

我不熟悉SNS,但根据我对其他AWS产品的经验,ClientError命名与HTTP apis匹配,后者往往有详细记录。所以我从这里开始:https://docs.aws.amazon.com/sns/latest/api/Welcome.html

看起来新样式的建模异常是从生活在botocore模块中的服务定义文件生成的。我无法找到有关它的任何文档,但请浏览https://github.com/boto/botocore/tree/master/botocore/data中的AWS服务模型。

另外,如果您不是(与OP的代码相反)直接处理低级客户端,而是使用高级别的AWS {{1>,那么很高兴知道。对象,ServiceResource仍然可以轻松获得一个低级客户端,因此您可以处理这样的异常:

my_service_resource.meta.client

答案 1 :(得分:0)

使用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:
   pass