if password_Dictionary[username] == password:
print("Allow!\n")
break
else:
print("Wrong!\n")
if password_Dictionary[username] == password:
KeyError: 'cskmcdsk'
Если пользователь вводит имя пользователя, но не правильный пароль enter code here
, программа правильно запускает оператор печати, в котором говорится, что пользователь ввел неправильный пароль, но когда пользователь вводит неправильное имя пользователя / тот, который не существует, возникает ошибка KeyError с помощью cskmcdsk. это случайное имя пользователя, которое пользователь пытался ввести, но его не существует.
Как мне остановить кодирование от ошибки и вместо этого продолжить работу и вместо этого распечатать вывод, в котором указано, что имя пользователя отсутствует в словаре?
Кроме того, вы можете заключить "password_Dictionary [username] в блок try except, но вы должны делать это только в том случае, если это ошибка, если это ожидаемое событие, то ответ Lucefer более уместен.
Возможный дубликат Запрашивать у пользователя ввод до тех пор, пока он не даст верный ответ
Вы можете просто использовать блок try catch для ключевой ошибки, поэтому, когда есть ошибка, вы можете ее поймать и сделать все, что захотите, когда вы поймаете KeyError
.
Нет, вы должны использовать отлично читаемый .get(key, defaultvalue)
. if key in dict:
редко имеет смысл, потому что вы, скорее всего, тоже собирались убрать ценность. использование KeyError
просто неправильно, минимум 4 строки для того, что вы могли бы сделать в 1-2, а также добавить ненужную идентификацию и сделать его менее читаемым.
Не используйте блок try
/ except
(исключения не относятся к нормальному потоку управления). Вместо этого либо проверьте наличие ключа в dict, например
if username in dictionary and dictionary[username] == password:
# do stuff
или, в качестве альтернативы, используйте dict.get
, который вернет None
, или какое-то значение по умолчанию (обязательно выберите значение по умолчанию, которое также не будет значением другой стороны ==
), например
{}.get('notakey') #=> None
{}.get('notakey', 'foo') #=> 'foo'
Кстати, если вы храните пароли, убедитесь, что вы используете надежную одностороннюю хеш-функцию (например, BCrypt).
@QRuns Хорошо, это ответ на ваш вопрос? Не забудьте проголосовать / принять ответы на ваши вопросы:)
вы можете использовать -> "if username in password_Dictionary", чтобы проверить, доступен ли этот ключ в словаре. если он вернет false. затем укажите эту ключевую ошибку