Python登录程序输入非列表密码触发ValueError问题求助
Python登录注册程序的ValueError问题排查
我编写了一个Python登录注册程序,将用户名和密码分别存储在列表中,登录时需要输入用户名和密码进行验证:
import sys global x global y lolusrnm = [] lolpasswrd = [] def login_function(): while True: global usrnm usrnm = str(input("please enter your username : ")) if usrnm in lolusrnm: while True: global passwrd global chkusrnmindx global chkpasswrdindx passwrd = str(input("Please enter your password : ")) chkusrnmindx = lolusrnm.index(usrnm) chkpasswrdindx = lolpasswrd.index(passwrd) if passwrd in lolpasswrd and chkpasswrdindx == chkusrnmindx: print("uou are in ") sys.exit() elif passwrd not in lolpasswrd: print("password dont match try again") else: global quot2 print("Wrong password, try again") quot2 = str(input("do u want to continue ")) if quot2 == "Y": continue elif quot2 == "N": sys.exit() else: print("Username dosent match..") def signup_function(): while True: global x global y print("Enter your username") x = str(input()) lolusrnm.append(x) y = str(input("Enter your password : " )) lolpasswrd.append(y) global sassy sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?") if sassy == "L": login_function() elif sassy == "S": continue signup_function()
运行程序完成注册后,使用已注册的用户名登录,输入不在密码列表中的密码时,程序触发以下ValueError错误:
Traceback (most recent call last): File "c:\Users\chand\Desktop\PythonBrocode.py", line 52, in <module> signup_function() File "c:\Users\chand\Desktop\PythonBrocode.py", line 48, in signup_function login_function() File "c:\Users\chand\Desktop\PythonBrocode.py", line 18, in login_function chkpasswrdindx = lolpasswrd.index(passwrd) ValueError: '(whatever password i enter which is not in the list)' is not in list
尽管我已经编写了针对密码不在列表中的处理逻辑:
elif passwrd not in lolpasswrd: print("password dont match try again")
我是Python新手,请求帮助排查该问题,谢谢!
问题原因
你写的代码里,先执行了chkpasswrdindx = lolpasswrd.index(passwrd),之后才判断passwrd not in lolpasswrd。当密码不在密码列表中时,list.index()方法会直接抛出ValueError,程序根本走不到后面的elif分支,所以你的错误处理逻辑根本没机会执行。
解决方案
方案1:调整代码执行顺序,先判断密码是否存在
把密码存在性的判断放在调用index()方法之前,这样就能避免异常:
import sys lolusrnm = [] lolpasswrd = [] def login_function(): while True: usrnm = str(input("please enter your username : ")) if usrnm in lolusrnm: while True: passwrd = str(input("Please enter your password : ")) # 先判断密码是否在列表中 if passwrd not in lolpasswrd: print("password dont match try again") continue # 密码存在时再获取索引 chkusrnmindx = lolusrnm.index(usrnm) chkpasswrdindx = lolpasswrd.index(passwrd) if chkpasswrdindx == chkusrnmindx: print("you are in ") sys.exit() else: print("Wrong password, try again") quot2 = str(input("do u want to continue ")) if quot2 == "N": sys.exit() else: print("Username dosent match..") def signup_function(): while True: print("Enter your username") x = str(input()) lolusrnm.append(x) y = str(input("Enter your password : " )) lolpasswrd.append(y) sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?") if sassy == "L": login_function() elif sassy == "S": continue signup_function()
方案2:使用try-except捕获异常
如果不想调整顺序,可以用异常捕获来处理index()方法抛出的错误:
import sys lolusrnm = [] lolpasswrd = [] def login_function(): while True: usrnm = str(input("please enter your username : ")) if usrnm in lolusrnm: while True: passwrd = str(input("Please enter your password : ")) chkusrnmindx = lolusrnm.index(usrnm) try: chkpasswrdindx = lolpasswrd.index(passwrd) except ValueError: print("password dont match try again") continue if chkpasswrdindx == chkusrnmindx: print("you are in ") sys.exit() else: print("Wrong password, try again") quot2 = str(input("do u want to continue ")) if quot2 == "N": sys.exit() else: print("Username dosent match..") def signup_function(): while True: print("Enter your username") x = str(input()) lolusrnm.append(x) y = str(input("Enter your password : " )) lolpasswrd.append(y) sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?") if sassy == "L": login_function() elif sassy == "S": continue signup_function()
方案3:改用字典存储(更推荐)
当前用两个列表存储用户名和密码的方式有隐患:如果两个用户的密码相同,index()会返回第一个匹配的索引,导致账号匹配错误。更合理的方式是用字典,直接将用户名和密码作为键值对存储:
import sys # 用字典存储用户名和密码,键是用户名,值是密码 user_credentials = {} def login_function(): while True: usrnm = str(input("please enter your username : ")) if usrnm in user_credentials: while True: passwrd = str(input("Please enter your password : ")) if user_credentials[usrnm] == passwrd: print("you are in ") sys.exit() else: print("Wrong password, try again") quot2 = str(input("do u want to continue ")) if quot2 == "N": sys.exit() else: print("Username dosent match..") def signup_function(): while True: print("Enter your username") username = str(input()) if username in user_credentials: print("Username already exists, choose another one") continue password = str(input("Enter your password : " )) user_credentials[username] = password sassy = input("Do you want to (L)ogin? or continue to (S)ign up another account?") if sassy == "L": login_function() elif sassy == "S": continue signup_function()
这个版本不仅避免了索引匹配的问题,代码逻辑也更简洁。
内容的提问来源于stack exchange,提问作者chnkrn287
相关产品推荐
相关产品推荐

