Python中try、except、finally执行顺序详解

凌晨两点半
凌晨两点半
发布时间:2026-10-13 | 5人浏览过
原创

本文详细解析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执行顺序的详细解析即为全部内容,希望能为大家提供有效的参考,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表