python 异常捕捉finally语句陷阱

定义如下函数:

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等中断程序逻辑的语句,以免出现非预期错误。

猜你喜欢

转载自blog.csdn.net/S_o_l_o_n/article/details/115083670
今日推荐