如何捕获`botocore.errorfactory.UserNotFoundException`?

Sar*_*rit 8 python botocore boto3

我正在使用AWS Cognito制作OAuth服务器。我现在正在创建异常处理程序以防使用不存在,但requests打算获得一个

ipdb> pk
'David'
ipdb> res = self.cognito_client.admin_get_user(
            UserPoolId=settings.AWS_USER_POOL_ID,
            Username=pk
        )
*** botocore.errorfactory.UserNotFoundException: An error occurred (UserNotFoundException) when calling the AdminGetUser operation: User does not exist.
Traceback (most recent call last):
  File "/Users/sarit/.pyenv/versions/futuready-titan/lib/python3.8/site-packages/botocore/client.py", line 316, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/Users/sarit/.pyenv/versions/futuready-titan/lib/python3.8/site-packages/botocore/client.py", line 626, in _make_api_call
    raise error_class(parsed_response, operation_name)
Run Code Online (Sandbox Code Playgroud)
boto3==1.12.15            # via -r el.in
botocore==1.15.15         # via boto3, s3transfer
django==3.0.3
python3.8.1
Run Code Online (Sandbox Code Playgroud)

我已经检查过botocore 源代码 UserNotFoundException

问题:
我怎么能具体说catch这个exception

Max*_*lov 36

当异常创建时,botocore.error_factory无法直接导入它。您应该使用生成的类来处理异常,而不是直接导入。

文档中为每个操作提供了可能的异常列表。例如,对于CognitoIdentityProvider.Client.admin_get_user,可能的例外情况有:

CognitoIdentityProvider.Client.exceptions.ResourceNotFoundException
CognitoIdentityProvider.Client.exceptions.InvalidParameterException
CognitoIdentityProvider.Client.exceptions.TooManyRequestsException
CognitoIdentityProvider.Client.exceptions.NotAuthorizedException
CognitoIdentityProvider.Client.exceptions.UserNotFoundException
CognitoIdentityProvider.Client.exceptions.InternalErrorException
Run Code Online (Sandbox Code Playgroud)

有一个示例说明如何获取客户端的示例列表以及如何处理它(当然异常列表取决于操作):

CognitoIdentityProvider.Client.exceptions.ResourceNotFoundException
CognitoIdentityProvider.Client.exceptions.InvalidParameterException
CognitoIdentityProvider.Client.exceptions.TooManyRequestsException
CognitoIdentityProvider.Client.exceptions.NotAuthorizedException
CognitoIdentityProvider.Client.exceptions.UserNotFoundException
CognitoIdentityProvider.Client.exceptions.InternalErrorException
Run Code Online (Sandbox Code Playgroud)

此外,您可能会捕获较少类型的内容botocore.exceptions.ClientError而不是特定的内容:

import boto3

eks = boto3.client('eks')
print(dir(eks.exceptions))
# ['BadRequestException', 
# 'ClientError', 
# 'ClientException',
# 'InvalidParameterException',
# 'InvalidRequestException',
# 'NotFoundException',
# 'ResourceInUseException',
# 'ResourceLimitExceededException',
# 'ResourceNotFoundException',
# 'ServerException',
# 'ServiceUnavailableException',
# 'UnsupportedAvailabilityZoneException', ...]
try:
    response = eks.list_nodegroups(clusterName='my-cluster')
except eks.exceptions.ResourceNotFoundException as e:
    # do something with e
    print("handled: " + str(e))

cognito_idp = boto3.client('cognito-idp')
print(dir(cognito_idp.exceptions))
# [ 'ClientError', 
# 'ConcurrentModificationException',
# 'DeveloperUserAlreadyRegisteredException',
# 'ExternalServiceException',
# 'InternalErrorException',
# 'InvalidIdentityPoolConfigurationException',
# 'InvalidParameterException',
# 'LimitExceededException',
# 'NotAuthorizedException',
# 'ResourceConflictException',
# 'ResourceNotFoundException',
# 'TooManyRequestsException', ... ]
try:
    response = cognito_idp.admin_get_user(
        UserPoolId='pool_id',
        Username='username'
    )
except cognito_idp.exceptions.UserNotFoundException as e:
    # do something with e
    print("handled: " + str(e))
Run Code Online (Sandbox Code Playgroud)

  • 这真是太痛苦了。我不明白为什么 AWS 不直接公开异常。如果我有一个测试用例,我想要一个副作用来引发异常,但我正在嘲笑 Glue 等客户端,该怎么办? (2认同)

Car*_*arl 6

有两种方法,如果异常暴露在客户端上,您可以直接捕获异常,或者从 botocore.exceptions 导入并改用它。

选项1:

try: 
    res = self.cognito_client.admin_get_user(
              UserPoolId=settings.AWS_USER_POOL_ID,
              Username=pk
          )
except self.cognito_client.exceptions.UserNotFoundException as e:
    print(e)
Run Code Online (Sandbox Code Playgroud)

选项 2:

from botocore.exceptions import UserNotFoundException

try: 
    res = self.cognito_client.admin_get_user(
              UserPoolId=settings.AWS_USER_POOL_ID,
              Username=pk
          )
except UserNotFoundException as e:
    print(e)
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅 botos 错误处理文档

  • 无法从“botocore.exceptions”导入名称“UserNotFoundException”(/home/ec2-user/anaconda3/envs/python38/lib/python3.8/site-packages/botocore/exceptions.py) (3认同)

Int*_*ude 4

这当然不理想,但我可以通过以下方式捕获它:

from botocore.exceptions import ClientError

try:
    func_that_interacts_with_cognito()
except ClientError:
    # This happens when the user is not found.
    print("It happened again ...")
Run Code Online (Sandbox Code Playgroud)