Python 2.6.5(r265:79063,2012年10月1日,22:07:21)
我有这个:
def f():
try:
print "a"
return
except:
print "b"
else:
print "c"
finally:
print "d"
f()
这给出了:
a
d
而不是预期的
a
c
d
如果我评论退货,那么我会得到
a
c
d
我如何记住python中的这种行为?
答案 0 :(得分:7)
如有疑问,请咨询the docs:
如果控制流出
else
子句的末尾,则执行可选的try
子句目前,除了例外情况或执行
return
,continue
或break
声明外,控制“流出结尾”。
由于您return
阻止了try
,else
将不会被执行。
答案 1 :(得分:2)
finally
阻止总是发生。这是finally
。
你可以记住这是finally
所做的事情。不要被其他控制结构混淆,例如if / elif / else / while / for / ternary / what语句,因为它们没有这个合同。 finally
确实如此。
答案 2 :(得分:1)
连接到try块的else
块在异常机制方面并不特殊 - 它类似于在try块之后将代码放在函数体中。唯一的功能是能够在try块和finally块之间执行“普通”代码。但这确实意味着如果函数在到达else块之前返回,它将永远不会执行。
答案 3 :(得分:1)
答案 4 :(得分:1)
try
块。print "a"
。return
语句,函数返回。finally
块总是执行,但finally
块中的所有内容都在函数实际结束执行之前发生。仅在else
块已完成且未发生异常时输入try
块。因为您在return
块中try
编辑了,但即使没有发生异常,也没有完成。就好像你根本没有try
/ else
块一样,并且你把所有代码放在同一级别的缩进上。
try
/ else
更多是为了代码组织而存在的;除非添加finally
块,否则与使用无else
块完全相同。以下是功能相同的:
try:
print "foo"
except:
print "woops"
else:
print "bar"
try:
print "foo"
except:
print "woops"
print "bar"
但是,如果您要使用else
,则必须使用finally
。这没有任何意义:
try:
print "foo"
except:
print "woops"
print "bar"
finally:
print "done"
在这种情况下finally
应该引用什么?如果您打算使用else
,则必须使用finally
,除非您不打算在try
阻止之后但finally
之前发生任何事情。
答案 5 :(得分:0)
在return
... break
声明的continue
套件中执行try
,try
或finally
声明时{ {1}}子句也在“出路时”执行。finally
语句在continue
子句中是非法的。 (原因是当前实施存在问题 - 将来可能会解除此限制。)
这实际上来自文档。