大多数人不知道的try..except...finally中的陷阱!!
异常丢失:
请先看看下面的代码:
def fun():
try:
print('try--start')
a = 1/0
except ValueError as ret:
print(ret)
finally:
return 'finally'
print(fun())
执行的结果:
try--start
finally
按理说a = 1/0 应该会抛出ZeroDivisionError异常,但执行的结果却没有任何异常,下面我们来分析一下出现这种情况的原因
当try中发生了异常,首先会执行except,解释器会看看except后面有没有对应的异常声明,如果有就处理,如果except中没有对应的处理异常就会被临时保存起来,然后去执行finally语句,但如果finally中产生了新的异常或者执行了return或者break语句,那么临时保存的异常将会被丢失,从而导致了ZeroDivisionError并没有被真正的抛出来.
try中return丢失
请看如下代码:
def fun():
try:
print('try--start')
return 'try return'
except:
pass
finally:
return 'finally'
print(fun())
执行的结果是
try--start
finally
为什么没有返回try return呢?下面我们就来分析一下原因
finally有一个特性,那就是无论如何,finally中的代码都将被执行,那么当执行到try中return的时候函数fun将被结束返回,这个时候由于finally的特性,try中的return 'try return' 经暂时被挂起,当执行完finally中的语句之后再返回执行,可finally中却执行了另一个return,导致了函数直接结束了,此时try中的finally就被丢失了,
所有在我们的实际开发中我们应尽量避免在finally使用return语句返回.