Перехват конкретных исключений в Python

#python #boto3

#python #boto3

Вопрос:

Мой скрипт работает нормально, если я улавливаю все исключения из ошибки, с которой я столкнулся.

Однако, если я попытаюсь ограничить его только одним исключением, это ошибка, которую я получаю:

 except botocore.ProfileNotFound:
NameError: name 'botocore' is not defined
  

Это мой код:

 import boto3
while True:
    try:
        aws_account = input("Enter the name of the AWS account you'll be working in: ")
        session = boto3.Session(profile_name=aws_account)
        resource = session.resource('iam')
        client = session.client('iam')
        kms_client = session.client('kms')
        secrets_client = session.client('secretsmanager')
        break
    except botocore.ProfileNotFound:
        print('AWS account does not exist. Try again!')
  

Если я изменю исключение на:

 except:
    print('AWS account does not exist. Try again!')
  

Программа работает.

Это полная ошибка, которую я пытаюсь исключить:

  raise ProfileNotFound(profile=profile_name)
botocore.exceptions.ProfileNotFound: The config profile (jf-ruby-dev) could not be found
  

Если я распечатаю точное исключение с:
except Exception as e then use print(type(e))

Это то, что я получаю:

The error type is: <class 'botocore.exceptions.ProfileNotFound'> .

И все же, если я сделаю:

from botocore.exceptions import ProfileNotFound в моем коде и после except botocore.exceptions.ProfileNotFound: этого я все еще получаю эту ошибку:

except botocore.exceptions.ProfileNotFound:
NameError: name 'botocore' is not defined
.

Что я делаю не так? Как я могу исключить эту ошибку конкретно?

Ответ №1:

Вам необходимо импортировать исключения из boto.

 from botocore.exceptions import ProfileNotFound
  

исключения не обязательно будут импортированы по умолчанию.

Комментарии:

1. Спасибо, я пробовал это. Я добавил из botocore.exceptions import ProfileNotFound и в свой код, который я делаю: except botocore.ProfileNotFound: . Но ошибка, которую я все еще получаю, такова except botocore.ProfileNotFound: NameError: name 'botocore' is not defined . Любые другие предложения?

2. Вы уже импортируете только исключение из botocore , а не все botocore , поэтому оно не существует в пространстве имен, чтобы из него вызывался атрибут. Либо импортируйте все botocore, либо просто вызовите исключение по имени. except botocore.ProfileNotFound -> except ProfileNotFound

3. Спасибо! Изменение исключения на просто: except ProfileNotFound: это то, что сработало!