Я пишу функцию Python для отправки запроса GET на URL-адрес с использованием пользовательских учетных данных и получения возвращаемого токена для последующего использования.В Python, как правильно выпрыгнуть из цикла While из Try?
# Function for logging in and get a valid token
def getToken():
while True: # Loop the cycle of logging in until valid token is received
try:
varUsername = raw_input("Enter your username: ")
varPassword = getpass.getpass("Enter your password: ")
reqAuthLogin = 'https://MY_URL?username=' + varUsername + '&password=' + varPassword # Send the login request
varToken = json.loads(urllib2.urlopen(reqAuthLogin).read())['Token'] # Attempt to parse the JSON response and read the Token, if possible
except: # If credential is invalid and no token returned
os.system('cls')
print 'Invalid credentials. Please try again. \n'
else: # I want this Try to exit the while loop if login is successful
break
os.system('cls')
return varToken # Return the retrieved token at the end of this function
Когда комбинация имени пользователя и пароля неверна, код генерирует исключение KeyError. Я узнал, что Try-Else может разрушить самый внутренний цикл, в этом случае должен быть цикл while. В моей конструкции, я хотел функцию, чтобы вывести следующее сообщение при возникновении исключения (то есть недействительные учетные данные):
Invalid credentials. Please try again.
Enter your username:
Если Войти успешно, код должен очистить экран и вернуть приобретенный маркер. Проблема в том, что этот код работал хорошо, когда они не были в Try, а не в While. Теперь он выдает это когда Войти успешно:
Enter your username:
Видимо программа не выполняет Else ветви, даже если никаких исключений не происходят. Я новичок в Python, пожалуйста, помогите мне определить причину этой ошибки.
EDIT: Спасибо за советы в комментариях. Я установил несколько точек останова, но точки останова показали, что даже если я вставляю разрыв в конце блока try, программа выполняет его сначала, а затем напрямую возвращается к выражению «while True». Казалось, что перерыв не удался из цикла.
Вы не должны использовать исключения Pokémon (Gotta catch' em all). – Moberg
Проще всего просто положить перерыв в конце try: block. – RemcoGerlich
Положите разрыв в код try. –