我只是选择python作为我的首选脚本语言,我试图找出如何使用boto3进行正确的错误处理.
我正在尝试创建一个IAM用户:
def create_user(username, iam_conn):
try:
user = iam_conn.create_user(UserName=username)
return user
except Exception as e:
return e
Run Code Online (Sandbox Code Playgroud)
当对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'
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是当这个失败时(比如用户已经存在),我只得到一个类型为botocore.exceptions.ClientError的对象,只有文本告诉我出了什么问题.
示例:ClientError('调用CreateUser操作时发生错误(EntityAlreadyExists):名称已省略的用户已存在.',)
这个(AFAIK)非常难以处理错误,因为我不能只打开生成的http状态代码(根据IAM的AWS API文档,用户已经存在409).这让我觉得我必须以错误的方式做事.最佳方式是boto3永远不会抛出异常,但juts总是返回一个反映API调用方式的对象.
任何人都可以在这个问题上启发我或指出我正确的方向吗?
非常感谢!
我想测试一些错误处理逻辑,所以我想在单元测试中模拟特定的异常类型。我正在模拟对 boto3 的调用,但我想进行该模拟以引发异常ParameterNotFound。我正在测试的代码遵循以下模式:
boto3_client = boto3.client('ssm')
try:
temp_var = boto3_client.get_parameter(Name="Something not found")['Parameter']['Value']
except boto3_client.exceptions.ParameterNotFound:
... [logic I want to test]
Run Code Online (Sandbox Code Playgroud)
我创建了一个单元测试模拟,但我不知道如何使其引发异常作为此 ParameterNotFound 异常。我尝试了以下方法,但它不起作用,因为在评估 except 子句时它得到“异常必须从基类派生”:
@patch('patching_config.boto3.client')
def test_sample(self, mock_boto3_client):
mock_boto3_client.return_value = mock_boto3_client
def get_parameter_side_effect(**kwargs):
raise boto3.client.exceptions.ParameterNotFound()
mock_boto3_client.get_parameter.side_effect = get_parameter_side_effect
Run Code Online (Sandbox Code Playgroud)
如何在单元测试中模拟 ParameterNotFound boto3 异常?