12
26
2011
7

异常:try vs finally,程序控制权的争夺

经典代码(同样适用于Java、JavaScript):

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

调用lol()后,究竟是返回False还是True呢?相信你和我一样,最开始认为是True,因为try中的语句先执行,对吧?

但事实上:

>>> lol()
False

try had a try. Finally, finally won.

所以,不要在异常语句中用return……

Category: 计算机 | Tags: python 编程 异常 | Read Count: 4610
Avatar_small
tolbKni 说:
2011年12月26日 14:46

finally优先于try中的return语句执行,所以finally中,如果有return,则会直接返回,而不是调用try中的return;catch中的return也是一样,也就是说,在return之前,肯定会先调用finally中的return。

Avatar_small
cuihao 说:
2011年12月26日 20:38

@tolbKni: 不是try后面的先执行么?

>>> try:
...     print("hi")
... finally:
...     print("lo")
...
hi
lo

Avatar_small
cuihao 说:
2011年12月26日 20:38

OO 诶,代码显示得好奇怪。

Avatar_small
tolbKni 说:
2011年12月26日 20:45

@cuihao: return 语句需要特殊对待

Avatar_small
依云 说:
2012年1月03日 22:17

@cuihao: try 里边遇到 return 了。解释器准备返回了!finally 赶紧跳出来喊:喂,你还没按规矩执行我呢?于是解释器就去执行 finally 里的 return 了。再然后,函数返回,就没有然后了。

Avatar_small
tolbkni 说:
2012年1月04日 22:14

@依云: 那么 catch 语句块如何解释?

Avatar_small
依云 说:
2012年1月04日 22:24

@tolbkni: 也一样啊,不管是 try 还是 except 部分,都不能绕过 finally 的。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

| Theme: Aeros 2.0 by TheBuckmaker.com