Python尝试finally块返回

sky*_*bbi 59 python try-catch try-finally try-except

下面有一些有趣的代码:

def func1():
    try:
        return 1
    finally:
        return 2

def func2():
    try:
        raise ValueError()
    except:
        return 1
    finally:
        return 3

func1()
func2()
Run Code Online (Sandbox Code Playgroud)

可以请有人解释,结果将返回这两个函数并解释原因,即描述执行的顺序

lej*_*lot 106

从Python 文档

在离开try语句之前总是执行finally子句,无论是否发生了异常.当try子句中发生异常且尚未由except子句处理(或者它发生在except或else子句中)时,在finally子句执行后重新引发它.当通过break,continue或return语句留下try语句的任何其他子句时,finally子句也在"在出路上"执行.一个更复杂的例子(在同一个try语句中有except和finally子句,与Python 2.5一样):

因此,一旦使用return将try/except块保留,将返回值设置为给定 - 最后块将始终执行,并且应该用于释放资源等,同时在那里使用另一个返回 - 覆盖原始块.

在您的特定情况下,func1()返回2func2()返回3,因为这些是finally块中返回的值.

  • 值得注意的是,在这个例子中,如果你没有在`finally`块中放置`return`,那么`try`块中`return`语句中的任何值实际上都将被返回(并且不会被例如"无"重写. (10认同)

140*_*ser 29

它将始终进入finally块,因此它将忽略returntryexcept.如果你有一个return高于tryexcept,它将返回该值.

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
Run Code Online (Sandbox Code Playgroud)

  • 它实际上并没有“忽略”它,而是“覆盖”它,对吧?也就是说,如果有finally*除非*finally*也*返回,则返回不会被忽略。而且,在尝试之前返回会使尝试无法访问,对吧? (8认同)

Ter*_*ryA 7

print报表事先真的,确实有帮助:

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()
Run Code Online (Sandbox Code Playgroud)

返回:

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
Run Code Online (Sandbox Code Playgroud)

您会注意到python总是返回要返回的最后一件事,无论return 1两个函数中的代码"到达" .

一个finally总是运行,所以函数中返回的最后一件事是finally块中返回的内容.在func1,那是2.在func2,那是3.