异常处理
常见的变量代称
1.NameError 变量错误
2.IndexError 列表index错误
3.KeyError 字典的key不存在
4.EOFError iteration到末端
5.FileNotFoundError
6.8ModuleNotFoundError*
7.ValueError 值的类型不匹配
以下的应该在写代码的时候就规避掉
8.SyntaxError 语法错误
9.NameError 变量错误
需要报错的情景以及报错的常见情况
#什么时候最容易出异常:有用户参与的时候,有外界数据介入的时候,从文件里读或从网络上获取. #当有多行报错的时候,为啥? ''' # def func1():name # def func2(): # func1()#最后才报func1() # def main(): # func2()#第二报func2() # main()#先报main Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 18, in <module> main() File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 17, in main func2() File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 15, in func2 func1() File "C:/Users/Administrator/PycharmProjects/全栈学习/day20/01异常处理.py", line 13, in func1 def func1():name NameError: name 'name' is not defined '''
except以及多分支
#try 可以只有一个 except可有多个(多分支),多分支合并: 多个error可以放到一个元组再放到一个except下. # 多分支合并 l = ['login','register'] for num,i in enumerate(l,1): print(num,i) try: num = int(input('num >>>')) print(l[num - 1]) except (ValueError,IndexError) : print('您输入的内容不合法') #万能异常except:(等所有程序开发完了,测试完了才开始用万能异常) #示例: def buy(): print('buy') name#valueerror def back(): print('back') [][1]#indexerror def show(): print('show') 1/0#zerodivisionerror def main(): l = [('购物',buy),('退货',back),('查看订单',show)] while True: for num,i in enumerate(l,1): print(num,i[0]) num = int(input('num >>>'))#已知可能发生valueerror,可以利用多分支合并到下面的万能异常里面 print(l[num - 1]) try: # num = int(input('num >>>')) # print(l[num - 1]) func = l[num - 1][1] func() # except (ValueError,IndexError): # print('您输入的内容不合法') except Exception as e:#万能异常,应该永远放在最下面.相当于except:但except:取不到信息. print(e.args,e.__traceback__.tb_lineno,e.__traceback__.tb_frame)#发生了什么异常,在第几行发生的, print('用户在选择了%s操作之后发生了不可知的异常' % l[num - 1][0]) # main()
else以及finally分支
#else分支 try: print('aaa') name [][1] except NameError: print('name error') except IndexError: print('index error') except Exception as e: print('exception') else: print('else error')#没有异常的时候才执行,如果程序成功了要汇报一句. finally: print('finally')#无论如何都会被执行 finally分支 def func(): f = open('file','r') try: while True: for line in f if line.startswith('a') return line except: print('异常') finally:#即使报错,程序结束或者return,也会先执行finally中的代码,可以直接和finally去联用.有利地保障资源回收. f.close() print('文件已经关闭了')#with open有三个错误处理不了,关闭不了文件. #finally用于回收一些操作系统的资源:比如文件句柄,网络连接,连接数据库就是借用了操作系统的网卡, #总结:写一个try: 必须带上except or finally or except+else. #主动抛出异常 用户输入了你不想让他输入的东西就主动抛异常. # raise ValueError('你写的不对')#禁止给用户抛异常,给其它开发者用的.django是别人写的程序,是一个框架.
断言以一些注意事项
#断言 新语法 assert 1 == 2#只能接受一个布尔值,False报assertionerror,好比if,就是程序向下执行的先决条件. print('123132123') #自定义异常:学完面向对象之后学 #异常处理的忠告: #程序在没开发完成,禁止在最外层加异常处理.要在经过测试以后再加.
#最后加是为了增强客户体验,应该try:main(0 except exception as f:将错误加到程序里.