2016-12-20 11 views
0

Я пишу функцию 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». Казалось, что перерыв не удался из цикла.

+1

Вы не должны использовать исключения Pokémon (Gotta catch' em all). – Moberg

+1

Проще всего просто положить перерыв в конце try: block. – RemcoGerlich

+0

Положите разрыв в код try. –

ответ

1

Почему бы не просто добавить bool, который был изменен в конце успешной попытки?

# Function for logging in and get a valid token 
def getToken(): 
    gotToken = False 
    while not gotToken: # 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 
      gotToken = True 
     except: # If credential is invalid and no token returned 
      os.system('cls') 
      print 'Invalid credentials. Please try again. \n' 
    os.system('cls') 
    return varToken # Return the retrieved token at the end of this function 
+0

Спасибо! Ваше решение сработало. Хотя я не знаю, почему мой ELSE не работает, я буду использовать ваш метод в качестве замены ... – xyx0826