异常
异常就是程序运行错误或者逻辑混乱。需要给客户友好的提示。异常一般是程序中无法完全避免,一般通过一定的手段,尽量减少异常的发生。
当Python检测到一个错误时,解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常"
1.捕获异常
1.1 try...except...
try:
可能出现异常的代码
except:
对异常信息做出的解释
#记录异常信息
except后不写任何类,表示捕捉任何异常。当出现异常,其实解析器会被这种异常分析,实例化得到一个异常对象 xx。然后再与except里的异常类进行匹配,如果能匹配,as将异常对象赋给ex
·把可能出现问题的代码,放在try中
·把处理异常的代码,放在except中
如:
path = input('输入文件的路径:')print('1......')
content = None
try:
print('2......')
content = open(path,'r',encoding='utf-8').read()
a = 10/0
print('3......')
except (FileNotFoundError,NameError,ZeroDivisionError) as ex:
print('4......')
print('输入的路径不存在')
print(ex)
print('5......')
print(content)
如果输入错误路径,运行结果如下:
输入文件的路径:sd
1......
2......
4......
输入的路径不存在
[Errno 2] No such file or directory: 'sd'
5......
None
1.2 except捕获多个异常
开发的时候建议,捕捉异常要写的更详细。
但是一般直接用Exception。简单省事。
如果需要写很多异常类的描述,按照从小到大的顺序。
因为有一个捕捉到了异常。不会再被捕捉了。
注意:
·当捕获多个异常时,可以把要捕获的异常的名字,放到except后,并使用元组的方式仅进行存储
如
try:
num = 10/0
except Exception as ex:
print('2......')
except FileNotFoundError as ex:
print('0......')
except ZeroDivisionError as ex:
print('1......')
运行结果:
2......
try:
num = 10/0
except FileNotFoundError as ex:
print('0......')
except ZeroDivisionError as ex:
print('1......')
except Exception as ex:
print('2......')
运行结果:
1......
1.3 else
我们对else并不陌生,在if中,它的作用是当条件不满足时执行的实行;同样在try...except...中也是如此,即如果没有捕获到异常,那么就执行else中的事情
1.4 try...finally...
try:
pass
finally:
pass
try...finally...语句用来表达这样的情况:
在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。比如文件关闭,释放锁,把数据库连接返还给连接池等
2异常的传递
2.1 try嵌套
import time
try:
#f = open('test.txt')
f = open(r'C:\Users\Administrator\Desktop\xx.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
num=1/0 #模拟一个异常
#time.sleep(2)
print(content)
#except:
#print('except...')
finally:
f.close()
print('关闭文件')
except:
print('没有这个文件')
运行结果:
没有这个文件
2.2 函数嵌套调用
·如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
·如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样
def test1():
print("----test1-1----")
try:
print(num)
except:
print('test1 except......')
print("----test1-2----")
def test2():
print("----test2-1----")
test1()
print("----test2-2----")
def test3():
try:
print("----test3-1----")
test1()
print("----test3-2----")
except Exception as result:
print("捕获到了异常,信息是:%s"%result)
print("----test3-2----")
test3()
print("------华丽的分割线-----")
test2()
结果:
----test3-1----
----test1-1----
test1 except......
----test1-2----
----test3-2----
----test3-2----
------华丽的分割线-----
----test2-1----
----test1-1----
test1 except......
----test1-2----
----test2-2----