python 异常捕捉finally语句陷阱

本文解析了Python中finally语句的执行逻辑,重点讨论了finally块中return或break如何影响try-except-else-finally结构的行为,以及为何finally_trap1不抛出异常,finally_trap2不返回预期值。
摘要由CSDN通过智能技术生成

定义如下函数:

def finally_trap1():
    try:
        raise IndexError('index error')
    except KeyError:
        print('key error got')
    finally:
        print('finished')
        return 


def finally_trap2(x):
    try:
        if x > 1:
            return x
    except KeyError:
        print('key error got')
    finally:
        print('finished')
        return 0

调用finally_trap1(),我们预期会抛出IndexError异常,但是实际上仅仅只输出了finally下面的finished。调用finally_trap2(7),我们预期输出7,但实际上输出0.

发生上述现象的原因跟python的异常捕捉中执行finally语句的逻辑有关。具体的,当try下面的代码没有抛出异常或者抛出了异常但是异常没有被except捕获,那么在退出try-except-else-finally逻辑之前,会先执行finally下面的代码,等finally代码执行完毕后,再将try下面代码最后的逻辑执行完毕。比如上例中,finally_trap1的try最后逻辑是抛出异常,finally_trap2的try代码最后逻辑是rertun x。问题在于,如果finally代码中包含了return或者break等代表逻辑结束的语句,那么try代码中的最后逻辑将会被忽略,不再被执行,这就是为什么finally_trap1中不再抛出异常,finally_trap2中不再返回x的原因。

同样的,如果except中捕捉到的相应的异常,那么会先执行except下的代码,但是在执行except语句的最后逻辑前,还是会先转而执行finally下的代码,因此,假设except中有相应的return语句,但是实际上最后执行的是finally中的return。

因此在使用finally时,要避免在finally下的代码中使用return或break等中断程序逻辑的语句,以免出现非预期错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值