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


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值