Python中try、except、finally执行顺序详解
本文详细解析Python中try、except和finally块的执行顺序及交互逻辑。通过五个测试案例,阐明当异常抛出、正常返回或循环中断时,finally块如何强制介入执行。重点说明return语句在finally存在时的行为:若finally无return,原返回值被锁定并保留;若finally有return,则覆盖原返回值。
具体代码示例如下所示:
def test1():
try:
print('to do stuff')
raise Exception('hehe')
print('to return in try')
return 'try'
except Exception:
print('process except')
print('to return in except')
return 'except'
finally:
print('to return in finally')
return 'finally'
test1Return = test1()
print('test1Return : ' + test1Return)
程序运行后的输出结果如下:
to do stuff process except to return in except to return in finally test1Return : finally
当在try代码块中主动raise抛出异常时,程序会立即跳转至except块执行;若在except块中遇到return语句,则会强制跳转到finally块执行;若finally块中也包含return语句,则直接返回该结果。
def test2():
try:
print('to do stuff')
print('to return in try')
return 'try'
except Exception:
print('process except')
print('to return in except')
return 'except'
finally:
print('to return in finally')
return 'finally'
test2Return = test2()
print('test1Return : ' + test2Return)
对应的程序输出如下:
to do stuff to return in try to return in finally test2Return : finally
在此场景下,try代码块内未抛出异常,因此不会进入except块;但如果在try块中遇到return语句,程序同样会立即强制跳转至finally块执行,并最终在finally块中返回结果。
基于test1和test2两个测试用例,可以得出以下结论:
无论是在try还是except代码块中,只要定义了finally语句,当遇到return时,当前return操作会被中断并强制跳转至finally块执行。如果finally块中定义了return语句,则直接返回该值,不再跳回try或except中被中断的return点。
def test3():
i = 0
try:
i += 1
print('i in try : %s'%i)
raise Exception('hehe')
except Exception:
i += 1
print('i in except : %s'%i)
return i
finally:
i += 1
print ('i in finally : %s'%i )
print('test3Return : %s'% test3())
相关测试的输出结果如下:
i in try : 1
i in except : 2
i in finally : 3
test3Return : 2
def test4():
i = 0
try:
i += 1
return i
finally:
i += 1
print ('i in finally : %s'%i )
print('test4Return : %s' % test4())
另一组测试的输出结果如下:
i in finally : 2 test4Return : 1
根据test3和test4的测试结果,可以得出以下结论:
当在except或try代码块中遇到return时,程序会先锁定return的值,随后跳转至finally块执行。如果finally块中没有return语句,则finally执行完毕后,仍返回原return点,输出之前锁定的值(即finally中的操作不影响返回值);如果finally块中包含return语句,则执行finally中的return语句并返回。
def test5():
for i in range(5):
try:
print('do stuff %s'%i)
raise Exception(i)
except Exception:
print('exception %s'%i)
continue
finally:
print('do finally %s'%i)
test5()
最后一组测试的输出结果如下:
do stuff 0 exception 0 do finally 0 do stuff 1 exception 1 do finally 1 do stuff 2 exception 2 do finally 2 do stuff 3 exception 3 do finally 3 do stuff 4 exception 4 do finally 4
根据test5的测试结果,可以得出以下结论:
在循环结构中,当程序最终需要跳出循环之前,会先跳转至finally块执行;待finally执行完毕后,才开始下一轮循环。
以上关于Python中try、except、finally执行顺序的详细解析即为全部内容,希望能为大家提供有效的参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













