在try块中使用return的try/else
我遇到了一个在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
。
当发生异常时,finally
和 except
这两个部分会在 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”部分的最后,只有在出现错误、或者执行了返回、继续或跳出循环的指令时,才会中断这个流程。