大多数人不知道的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语句返回.


猜你喜欢

转载自blog.csdn.net/fanlei5458/article/details/80035635