当前位置: 首页 > 面试题库 >

boto3如何处理错误?

南门朗
2023-03-14
问题内容

我试图弄清楚如何使用boto3进行正确的错误处理。

我正在尝试创建一个IAM用户:

def create_user(username, iam_conn):
    try:
        user = iam_conn.create_user(UserName=username)
        return user
    except Exception as e:
        return e

成功调用create_user后,我得到一个整洁的对象,其中包含API调用的http状态代码和新创建的用户的数据。

例:

{'ResponseMetadata': 
      {'HTTPStatusCode': 200, 
       'RequestId': 'omitted'
      },
 u'User': {u'Arn': 'arn:aws:iam::omitted:user/omitted',
           u'CreateDate': datetime.datetime(2015, 10, 11, 17, 13, 5, 882000, tzinfo=tzutc()),
           u'Path': '/',
           u'UserId': 'omitted',
           u'UserName': 'omitted'
          }
}

这很好。但是,如果失败(例如用户已经存在),我只会得到一个类型为botocore.exceptions.ClientError的对象,其中只有文本可以告诉我出了什么问题。

示例:ClientError(’调用CreateUser操作时发生错误(EntityAlreadyExists):名称省略的用户已经存在。’,)

此(AFAIK)使得错误处理变得非常困难,因为我不能仅打开生成的http状态代码(根据IAM的AWS
API文档,该用户的409已经存在)。这使我认为我必须以错误的方式做某事。最佳的方式是让boto3永远不会抛出异常,但是突出部分总是返回一个反映API调用过程的对象。

谁能在这个问题上启发我或为我指明正确的方向?


问题答案:

使用异常中包含的响应。这是一个例子:

import boto3
from botocore.exceptions import ClientError

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print("Created user: %s" % user)
except ClientError as e:
    if e.response['Error']['Code'] == 'EntityAlreadyExists':
        print("User already exists")
    else:
        print("Unexpected error: %s" % e)

异常中的响应字典将包含以下内容:

  • ['Error']['Code'] 例如“ EntityAlreadyExists”或“ ValidationError”
  • ['ResponseMetadata']['HTTPStatusCode'] 例如400
  • ['ResponseMetadata']['RequestId'] 例如’d2b06652-88d7-11e5-99d0-812348583a35’
  • ['Error']['Message'] 例如“发生错误(EntityAlreadyExists)…”
  • ['Error']['Type'] 例如“发件人”

有关更多信息,请参见:

  • boto3错误处理
  • botocore错误处理

[更新时间:2018-03-07]

AWS Python
SDK已开始在您可以显式捕获的客户端上公开服务异常(尽管不是在resource上),因此现在可以编写如下代码:

import botocore
import boto3

try:
    iam = boto3.client('iam')
    user = iam.create_user(UserName='fred')
    print("Created user: %s" % user)
except iam.exceptions.EntityAlreadyExistsException:
    print("User already exists")
except botocore.exceptions.ParamValidationError as e:
    print("Parameter validation error: %s" % e)
except botocore.exceptions.ClientError as e:
    print("Unexpected error: %s" % e)

不幸的是,目前没有关于这些异常的文档,但是您可以按如下方式获取它们的列表:

import botocore
import boto3
dir(botocore.exceptions)

请注意,您必须同时导入botocore和boto3。如果仅导入botocore,则将发现botocore没有名为的属性exceptions。这是因为异常是由boto3动态填充到botocore中的。



 类似资料:
  • python AWS boto3 s3 put_对象应该如何处理/测试错误?例如: 可能出现的错误是否记录在某个地方?下面的页面是否是正确的留档页面(似乎是为客户端,而不是),如果是,错误记录在哪里? http://boto3.readthedocs.io/en/latest/reference/services/s3.html#S3.Client.put_object 像不存在的bucket这样

  • 我上传到S3使用以下代码: 我无法了解boto内部如何处理分段上传的任何信息。我对同样的事情有几个问题,让我们假设我有2.5 MB的文件: 然后文件将分3部分上传,如1,1和.5 MB? 所有3个部分将并行上传还是按顺序上传? 在java的aws库中,我们有转移管理器,在博托中有什么类似的东西吗? 此代码是否足以用于多段上传?因为我遇到了一些复杂的代码示例 任何帮助都将不胜感激。

  • TL;DR:将身份验证数据传递给csv文件中名为参数(且未签入)的boto3脚本是否出于任何原因不如明文共享凭据文件(文档中的默认答案)安全? 我想写一个boto3脚本,打算从使用IAM密钥的笔记本电脑上运行。初始化会话的主要公认方法是将API密钥、密钥、区域和(如果适用)会话密钥包含在由标识的共享凭据文件中,或者将密钥和密钥本身作为环境变量(等)我想做的是将这些值从csv或类似文件加载到字典,然

  • 问题内容: 如何处理此调用上的etimedout错误? 有没有办法等待更长的时间?还是再次请求远程文件? 究竟是什么会导致此错误?仅超时? 问题答案: 这是由于在给定时间内未收到您的请求响应(通过 请求模块选项)引起的。 基本上首先要捕获该错误,您需要在上注册一个处理程序,因此不会再抛出未处理的错误:。这里还有一些解释。 在处理程序中,您可以检查错误是否为ETIMEDOUT并应用自己的逻辑:。 如

  • 本文向大家介绍如何处理jQuery AJAX错误?,包括了如何处理jQuery AJAX错误?的使用技巧和注意事项,需要的朋友参考一下 处理jQuery AJAX错误。每当AJAX请求失败时,ajaxError(callback)方法都会附加一个要执行的函数。这是一个Ajax事件。 这是此方法使用的所有参数的描述- callback- 要执行的功能。用于该请求的XMLHttpRequest和设置将