正确捕获boto3错误

大卫·舒曼(David Schumann):

我正在开发与多个Amazon Web Services通信的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

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

第二,我发现了一个办法赶上错误在这里使用:

try:
    # boto3 stuff
except botocore.exceptions.ClientError as e:
    if e.response['Error']['Code'] == 'NotFound':
        # handle exception
    else:
        raise e

但是我必须删除Exception错误名称一部分。似乎很随机的,我不知道我是否会删除Errorbotocore.exceptions.ParamValidationError,如果我想赶上那一个。因此很难一概而论。

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

try:
    # boto3 stuff
except client.exceptions.NotFoundException as e:
    # handle exception

到目前为止,这似乎是最干净的方法。但是我并不总是在想要捕获错误的地方使用boto3客户端对象。而且我仍然只是尝试,所以大部分都是猜测。

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

还是可以使我指向一些提到上述错误的连贯文档?谢谢

本作者:

您已经很好地概括了情况。旧版本boto使用简单的硬编码方法来支持AWS API。boto3,似乎是在尝试减少使Python客户端与各种api上不断发展的功能保持同步的开销,但对于异常的处理却更加松懈,因此您上面概述的ClientError方法曾经是规范方法。

在2017年,他们引入了您强调的第二种机制:客户端上可用的“建模”异常。

我对SNS并不熟悉,但是根据我在其他AWS产品上的经验,ClientError的命名与HTTP api相匹配,而这些api往往有据可查。所以我将从这里开始:https : //docs.aws.amazon.com/sns/latest/api/Welcome.html

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

另外,很高兴知道,如果您不(与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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章