1:写一个新的函数int_input(),输入整数的时候,正常返回。否则提示错误,并重新输入。
def int_input(temp): while True: try: int(input(temp)) #int() 把字符串数字转换成整形数字,如果参数不是数字,则产生异常 break except ValueError: print("出错啦,你输入的不是整数") int_input("请输入一个整数:")
2:把文件关闭放在finally里,还是有可能出问题。如果文件不能正常打开,最后关闭时也会出错误
try: f=open("我不是文件.txt") print(f.read()) except OSError as reason: print("出错啦,原因是:",reason) finally: f.close()
执行结果:
出错啦,原因是: [Errno 2] No such file or directory: '我不是文件.txt' Traceback (most recent call last): File "C:/Users/Administrator/AppData/Local/Programs/Python/Python36-32/test.py", line 9, in <module> f.close() NameError: name 'f' is not defined
可以通过下面方法,避免新的关闭时候的异常
try: f=open("我不是文件.txt") print(f.read()) except OSError as reason: print("出错啦,原因是:",reason) finally: if "f" in locals(): #如果文件对象变量存在当前局部变量符号表的话,说明打开成功 f.close()
3:使用with方法,不必再担心文件打开之后忘记关闭的尴尬
with会自动处理文件的关闭和打开,如果中途出现异常,会执行清理代码,确保文件自动关闭
try: with open("data.txt","w") as f: for each_line in f: print(each_line) except OSError as reason: print("出错啦!"+str(reason))
with可以同时处理多个项目,只需用逗号隔开
with a() as a,b() as b
4:用异常原理,是source更高效。 不用每次判断key是否存在,直接使用,然后在异常里处理
#判断编号是否正确 while True: print("|---欢迎进入通讯录---|") print("|--1:查询联系人资料--|") print("|--2:插入新的联系人--|") print("|--3:删除已有联系人--|") print("|--4:退出通讯录程序--|") try: num=int(input("请选择编号:")) if num not in range(1,5): print("编号输入错误,请重新输入!") else: #查找联系人---------------------------------------------------- if num==1: try: name=input("请输入联系人名称:") print(name,":",contacts[name]) except KeyError: print("找不到!") #插入联系人---------------------------------------------------- if num==2: name=input("请输入联系人名称:") try: print("该联系人已经存在!") #为了提高效率,直接输出该用户名信息,没有执行异常 print(name,":",contacts[name]) if(input("是否修改用户资料(YES/NO):") in ["YES","yes"]): contacts[name]=input("请输入用户联系电话:") except KeyError: contacts[name]=input("请输入用户联系电话:") #删除联系人---------------------------------------------------- if num==3: name=input("请输入联系人名称:") try: contacts.pop(name) except KeyError: print("您输入的联系人不存在!") #退出---------------------------------------------------- if num==4: break except ValueError: print("编号输入错误,请重新输入!")