在try块中使用return的try/else

70 投票
5 回答
126779 浏览
提问于 2025-04-17 02:25

我遇到了一个在Python中很奇怪的行为。我在Python的帮助文档和Stack Exchange上都找不到相关的信息,所以我就来这里问问:

def divide(x, y):
    print 'entering divide'
    try:
        return x/y
    except:
        print 'error'
    else:
        print 'no error'
    finally:
        print 'exit'

print divide(1, 1)
print divide(1, 0)

输出结果是:

entering divide
exit
1
entering divide
error
exit
None

看起来如果在try块中返回了一个值,Python就不会进入else块。不过,它总是会进入finally块。我不太明白这是为什么。有人能帮我解释一下这个逻辑吗?

谢谢!

5 个回答

22

因为你在执行到 else 这部分之前就已经离开了函数,所以 else 里的代码不会被执行。

不过,finally 这部分的代码是一定会被执行的,除非你拔掉电源线或者发生其他极端情况。

想象一下这个情况(作为一个思考实验;请不要在真实代码中这样做):

def whoops():
    try:
        return True
    finally:
        return False

看看它返回了什么:

>>> whoops()
False

如果你觉得这很困惑,那你并不孤单。有些编程语言,比如 C#,会主动阻止你在 finally 里放 return 语句。

27

这种行为的原因是因为在 try 里面有一个 return

当发生异常时,finallyexcept 这两个部分会在 return 之前执行。否则的话,只有 finally 会执行,而 else 就不会执行,因为函数已经返回了。

这个结果是符合预期的:

def divide(x, y):
    print 'entering divide'
    result = 0
    try:
        result = x/y
    except:
        print 'error'
    else:
        print 'no error'
    finally:
        print 'exit'

    return result

print divide(1, 1)
print divide(1, 0)
68

http://docs.python.org/reference/compound_stmts.html#the-try-statement

如果没有出现错误,程序顺利执行完“try”部分的代码,接下来会执行可选的“else”部分。

通常情况下,程序会顺利执行到“try”部分的最后,只有在出现错误、或者执行了返回、继续或跳出循环的指令时,才会中断这个流程。

撰写回答