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