1. 分类与语法:
- 系统解释器自动捕获异常
- 写程序自己捕获并展示: try---except---else---finally
- 注1:一旦引发了一个异常,程序就不会往下走,就不会引发其他的异常
- 注2:try包住有可能会出错的代码块,然后为它定义一个except部分输出异常信息。那么try部分一旦发生异常,整个程序就不会因为异常而终止,而是去执行except部分,并且会继续往下跑程序。
- 注3:当try部分没有出错,就继续执行else。
try:
num = 100
print(num) #如果传入的num写成了numm
except NameError as errorMsg:
print('产生错误了:%s'%errorMsg)
else:
print('没有捕获到异常,真高兴')
- 注4:不管try--except--else怎么执行,finally一定会执行
- 注5:try和except必须有, else 和 finally可以没有。
- 注6:在程序中,如果一个段代码必须要执行,即无论异常是否产生都要执行,那么此时就需要使用finally。 比如文件关闭,释放锁,把数据库连接返还给连接池等
import time
f = None
try:
f = open('test.txt')
try:
while True:
content = f.readline()
if len(content) == 0:
break
time.sleep(2)
print(content)
except:
pass #如果在读取文件的过程中,产生了异常,那么就会捕获到,比如按下了ctrl+c终止cmd窗口
finally:
if f: #存在f并且f为True
f.close()
print('关闭文件')
except:
print("没有这个文件")
2. 异常的传递:
如果发生了一个异常,却没有对应的except语句来处理异常,这个异常就会向上一层抛。
-
try嵌套中传递:
f = None
try:
f = open("test.txt")
try:
while True:
line = f.readline()
ind = line.index("hello") #查找hello的起始位置 {有可能发生ValueError}
x = 10/0 #有可能发生ZEROERROR,但此处不用except处理它,异常会向上层抛
#此处的上层即上一个try-except的except部分,如果它也不能处理
#再向上一层的try-except抛...直至遇到最底层的异常基类ExceptionError
if (line == ''):
break
except ValueError as ex: #仅仅捕捉了ind = line.index("hello")这里的异常,x=10/0没有捕捉
print(ex)
finally:
print("里层的finally") #不一定会执行,有可能代码执行第二行open异常,就直接去外层的except语句了
except (FileNotFoundError,ZeroDivisionError) as ex: #此处能处理x = 10/0,否则继续向上层抛
print(ex)
finally:
print("finally")
if f:
f.close() -
函数调用中传递:
由里层函数向外层函数抛,若外层也不能处理,就被基类ExceptionError接收,由编译器处理
def test1():
print("----test1-1----")
print(num)
print("----test1-2----") #不会运行
def test2():
print("----test2-1----")
test1() #发生异常,向外层函数抛,但没有try-except处理,所以会抛至基类ExceptionError,由编译器处理
print("----test2-2----") #不会运行
def test3():
try:
print("----test3-1----")
test1() #test1里面的异常会被传递至调用它的函数(由内向外抛)
print("----test3-2----") #不会运行
except Exception as result:
print("捕获到了异常,信息是:%s"%result)
print("----test3-3----") #不会运行
test3()
print("
")
test2()