try-except-else-finally,这种语法经常用来捕获异常,但是对这个结构理解不到位可能会带来意料之外的输出。
else是在没捕获到异常的时候会执行,这个基本语法逻辑不用细说。
但是无论是否抛出异常,最终一定会执行finally,所以在finally中的处理还是挺关键的。
1、保证finally中不要出现异常
def f():
try:
raise TypeError
except TypeError as e:
print e
finally:
print "finaly"
raise IndexError
print f()
输出:
finaly
Traceback (most recent call last):
File "C:/Users/yusy/Desktop/�����¼/test.py", line 10, in <module>
print f()
File "C:/Users/yusy/Desktop/�����¼/test.py", line 8, in f
raise IndexError
IndexError
如果在finally中出现了异常,会覆盖掉之前捕获到的异常,第一个抛出的异常丢失。
2、小心finally中的return丢失异常
def f():
try:
raise TypeError
except TypeError as e:
print e
finally:
print "finaly"
return 1
print f()
输出:
finaly
1
如果finally中有return语句,会直接返回值,捕获到的异常会丢失。
3、finally拦截了期望的返回值
def f():
try:
return 10
except TypeError as e:
print e
finally:
print "finaly"
return 1
print f()
输出:
finaly
1
我们希望返回值是10,但是最后却是1,因为try语句结束后会去执行finally,finally的return语句返回值覆盖了之前的返回值。
4、除了return 语句会让finally出现问题,break语句也会。
def f():
while True:
try:
return 10
except TypeError as e:
print e
finally:
print "finaly"
break
print f()
输出:
finaly
None
break同样会造成返回值覆盖和异常丢失。