在try块中使用return返回try / else

时间:2011-09-16 08:40:40

标签: python exception-handling

我在python中遇到了一个奇怪的行为。我在python帮助或SE上找不到相关信息,所以这里是:

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

如果在else中返回一个值,那么python似乎不会进入try块。但是,它始终位于finally块中。我真的不明白为什么。有人可以帮我解释这个逻辑吗?

感谢

5 个答案:

答案 0 :(得分:54)

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

  

如果控制流出,则执行可选的else子句   try子句的结尾。

     

目前,控制“流出结束”除外   异常或执行return,continue或break语句。

答案 1 :(得分:11)

此行为的原因是returntry

发生异常时,finallyexcept块都会在return之前执行。在没有异常发生的相反情况下,else运行而except不运行。

这可以按预期工作:

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)

答案 2 :(得分:8)

else块未执行,因为您在有机会之前已经离开了该功能。

但是,finally块总是被执行(除非你拉动电源线或类似的东西)。

考虑这一点(作为一个思想实验;请不要在实际代码中这样做):

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

查看它返回的内容:

>>> whoops()
False

如果你发现这令人困惑,你并不孤单。某些语言(如C#)会主动阻止您在return子句中放置finally语句。

答案 3 :(得分:2)

为什么else子句没有运行?

  

else子句对于必须执行的代码非常有用如果try子句没有引发异常

  • 当您致电divide(1, 0)时,您的try子句会引发异常 ZeroDivisionError,因此else子句无法运行

  • 当您致电divide(1, 1)时,try子句成功运行,并返回。所以永远不会达到else条款。

为什么finally子句始终运行?

  

finally子句在离开try语句之前始终执行,无论是否发生了异常。

见上文。

参考https://docs.python.org/3.5/tutorial/errors.html

答案 4 :(得分:1)

“return”结束函数并返回您想要返回的任何内容。所以它不会继续下去。总是执行“终于”。