我在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
块中。我真的不明白为什么。有人可以帮我解释这个逻辑吗?
感谢
答案 0 :(得分:54)
http://docs.python.org/reference/compound_stmts.html#the-try-statement
如果控制流出,则执行可选的else子句 try子句的结尾。
目前,控制“流出结束”除外 异常或执行return,continue或break语句。
答案 1 :(得分:11)
此行为的原因是return
内try
。
发生异常时,finally
和except
块都会在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语句之前始终执行,无论是否发生了异常。
见上文。
答案 4 :(得分:1)
“return”结束函数并返回您想要返回的任何内容。所以它不会继续下去。总是执行“终于”。