except后面空,就会捕获所有异常,我们可以指定错误类型,出现该种种错误就执行except
try: print(hello) except NameError: print('程序出错误了') else: print('程序正常运行') #程序出错误了Exception是所有异常的父类,如果exce后跟的是exception,它会捕获所有异常 与except后面为空的区别
空只能捕捉一种错误,如果有100个错误类型,就要写100次Exception,捕获所有异常,一行搞定。缺点,如果在很有100个错误,返回的都是最先出现的错误,你午饭辨别其他99个错误 try: lis = (1, 2, 3) lis[0] = 2 print(20/0) print(hello) except Exception as you: print('错误', you, type(you)) else: print('程序正常运行') # 错误 'tuple' object does not support item assignment <class 'TypeError'>as表示对Exception重新命名
finally
try: tup = (1, 2, 3) tup[0] = 2 except NameError: print('程序出错误了') except TypeError: print('我是类型错误') else: print('程序正常运行') finally: print('无论错不错我都会执行')如果try里面有两个错误,只会返回第一个错误,因为程序遇到错误就结束了
ZeroDivisionError上显示,第3和第5行有错误,错误明明在于20/0,但是错误会传播,传给了调度处
当程序运行过程中出现异常以后,所有的异常信息会被专门保存到一个异常对象当中而异常传播时,实际上就是异常对象抛给调度处 def error1(): print(20/0) def error2(): print('我是错误2') error1() def error3(): print('我是错误3') error2() error3() # Traceback (most recent call last): # File "f:/my_dream/text.py", line 10, in <module> # error3() # File "f:/my_dream/text.py", line 8, in error3 # error2() # File "f:/my_dream/text.py", line 5, in error2 # error1() # File "f:/my_dream/text.py", line 2, in error1 # print(20/0) # ZeroDivisionError: division by zero哪里调用,哪里就有毒
也可以直接在raise后跟Exception,这样就不用在额外定义异常类, 区别在于报错的对象不同 定义了NewError,错误就储存在NewError里