3

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 中记住这种行为?

4

6 回答 6

7

如有疑问,请查阅文档

可选子句在控制从子句else末尾流出时执行try

目前,除了出现异常或执行return, continue, orbreak语句的情况下,控制“流到最后”。

由于您是从块return的主体中​​获取的,因此不会执行。tryelse

于 2013-08-01T00:27:48.090 回答
2

finally总是会发生,除非虚拟机发生灾难性故障。这是合同的一部分finally

你可以通过记住这是做什么来记住这finally一点。不要被其他控制结构如 if/elif/else/while/for/ternary/whatever 语句所迷惑,因为它们没有这个契约。 finally做。

于 2013-08-01T00:34:24.180 回答
1

连接到 try 块的else块在异常机制方面并不特殊——它类似于将代码放在 try 块之后的函数体中。唯一的功能是能够在 try 块和 finally 块之间执行“正常”代码。然而,这确实意味着如果函数在到达 else 块之前返回,它将永远不会执行。

于 2013-08-01T00:26:08.537 回答
1

看看 Python 文档!

您将使用它进行异常处理,将此页面添加为书签!

http://docs.python.org/2/tutorial/errors.html

于 2013-08-01T00:27:18.537 回答
1
  1. 你进入try区块。
  2. print "a"
  3. 您遇到return语句并且函数返回。
  4. 但是,由于finally块总是执行,因此finally块中的所有内容都发生在函数实际结束执行之前。

仅当块已完成且未发生异常else时才进入该块。try因为您returntry块中编辑,所以它没有完成,即使没有发生异常。就好像您根本没有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因此,如果您要使用,则必须使用 Ergo ,finally除非您不打算在try块之后但在finally.

于 2013-08-01T01:00:43.887 回答
0

当在...<code>finally 语句套件中执行return, breakor语句时,该子句也将在“退出时”执行。子句中的陈述是非法的。(原因是当前实现存在问题——未来可能会取消此限制)。continuetrytryfinallycontinuefinally

这实际上来自文档。

于 2018-01-06T15:04:37.513 回答