Python try finally块返回
下面是有趣的代码:Python try finally块返回,python,try-except,try-finally,Python,Try Except,Try Finally,下面是有趣的代码: def func1(): 尝试: 返回1 最后: 返回2 def func2(): 尝试: 提升值错误() 除: 返回1 最后: 返回3 func1() func2() 请有人解释一下,返回这两个函数的结果是什么,并解释原因,即描述Python的执行顺序 无论是否发生异常,finally子句总是在离开try语句之前执行。当try子句中发生异常且except子句未处理该异常时(或该异常发生在except或else子句中),将在执行FINAL子句后重新引发该异常。当try语句的
def func1():
尝试:
返回1
最后:
返回2
def func2():
尝试:
提升值错误()
除:
返回1
最后:
返回3
func1()
func2()
请有人解释一下,返回这两个函数的结果是什么,并解释原因,即描述Python的执行顺序
无论是否发生异常,finally子句总是在离开try语句之前执行。当try子句中发生异常且except子句未处理该异常时(或该异常发生在except或else子句中),将在执行FINAL子句后重新引发该异常。当try语句的任何其他子句通过break、continue或return语句离开时,finally子句也会“在退出时”执行。一个更复杂的示例(在同一try语句中包含except和finally子句,与Python 2.5的情况相同):
因此,一旦使用return保留try/except块,它会将返回值设置为给定-最终块将始终执行,并应用于释放资源等。在使用该块时,另一个返回将覆盖原始块
在您的特定情况下,func1()
return2
和func2()
return3
,因为这些是在最后一个块中返回的值。func1()
返回2func2()
返回3
finally
块最终执行,而不管是否存在异常
您可以使用调试器查看执行顺序。例如,请参阅。事先放置
打印语句非常非常有帮助:
def func1():
try:
print 'try statement in func1. after this return 1'
return 1
finally:
print 'after the try statement in func1, return 2'
return 2
def func2():
try:
print 'raise a value error'
raise ValueError()
except:
print 'an error has been raised! return 1!'
return 1
finally:
print 'okay after all that let\'s return 3'
return 3
print func1()
print func2()
这将返回:
try statement in func1. after this return 1
after the try statement in func1, return 2
2
raise a value error
an error has been raised! return 1!
okay after all that let's return 3
3
您会注意到,python总是返回最后要返回的内容,而不管这两个函数中的代码“到达”return1
finally
块总是运行,因此函数中最后要返回的是finally块中返回的内容。在func1
中,这是2。在func2
中,即3。它将始终转到finally
块,因此它将忽略try
和except
中的返回。如果在try
和之外的上方有一个返回值
,它将返回该值
def func1():
try:
return 1 # ignoring the return
finally:
return 2 # returns this return
def func2():
try:
raise ValueError()
except:
# is going to this exception block, but ignores the return because it needs to go to the finally
return 1
finally:
return 3
def func3():
return 0 # finds a return here, before the try except and finally block, so it will use this return
try:
raise ValueError()
except:
return 1
finally:
return 3
func1() # returns 2
func2() # returns 3
func3() # returns 0
你永远不需要有人来解释结果是什么——你可以试试看。要求理性是一个有点不同的故事。请包括source@thefourtheye添加到文档文档的链接值得注意的是,举个例子,如果未在finally
块中放置return
,则try
块中return
语句中的任何值都将,事实上,将被返回(例如,不会被None
重写)。您会注意到,python总是返回最后要返回的内容,而不管两个函数中的代码“到达”返回1
我会说,当python在代码中找到finally块时,它会覆盖以前的返回值,我并不是说你上面的陈述是错误的,但是我想说的是,在finally块执行后,控制被转移,在finally块中使最终返回值超过riden。它实际上不是“忽略”它,而是“覆盖”它,对吗?也就是说,如果有finally,那么返回不会被忽略,除非finally也返回。而且,在尝试之前返回会使尝试无法实现,对吗?我已经测试过了,您完全正确。