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()
return
2
func2()
return
3
,因为这些是在最后一个块中返回的值。

func1()
返回2
func2()
返回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也返回。而且,在尝试之前返回会使尝试无法实现,对吗?我已经测试过了,您完全正确。