python中return语句在try except else finally中的执行顺序

python中return语句在try except else finally中的执行顺序

python版本: 3.7

首先先看下try except else finally的例子

def exe_try():
    try:
        print("start")
        raise KeyError
        return 1
    except KeyError as e:
        print("key error")
        return 2
    else:
        print("other")
        return 3
    finally:
        print("finally")
        # return 4


result = exe_try()
print(result)
# 可以看到它的执行结果是:
# start
# key error
# finally
# 4
# exe_try函数中它捕获了KeyError异常,可为什么没有返回2而是返回4呢?
# 这里涉及到return语句在 try except finally中的用法:
#   如果finally中有return语句, 它返回finally里的return语句,
#   如果finally没有return语句, 它就会返回前面调用的return语句
# 执行过程:
#   exe_try函数在执行时,打印start, 接着遇到KeyError异常
#   接着这个异常被捕获,执行except 中的代码块: 打印了key error, 并执行return 2
#   但是这个return 2并不会直接返回,而是把它放入了堆栈中
#   然后接着往下执行finally中的代码块: 打印finally,执行return 4
#   在这里它依然不会直接返回4, 而是把它也放在堆栈中
#   这时整个try except else finally都执行完了,它会在栈顶取出return并返回
#   而finally中的return是后放入到栈中,所以它在栈顶,取出并返回了 4。

# 如果finally中没有return语句,则会返回:
# start
# key error
# finally
# 2

转载于:https://my.oschina.net/u/4153263/blog/3072013

你可能感兴趣的:(python中return语句在try except else finally中的执行顺序)