作者shemale (雪梅)
看板Python
标题[闲聊] 最近学了try/except/else/finally
时间Mon May 23 15:37:33 2016
大家都知道try...except,我也一直只粗浅用了简单的应用。
最近学了else finally,就做了点小实验,有点出乎意料的结果,
可能python一开始就是这样定义,而我一直没注意到。
我先写了简单的:
def trytry():
try:
print 100 / 0
print "no exception"
except:
print "exception"
else:
print "else"
finally:
print "finally"
print "normal return"
return 0
跑出来的结果,大家也猜得出来,是
exception
finally
normal return
0
接下来,我在每个部分加上了return
def trytry():
try:
print 100 / 0
print "no exception"
return 1
except:
print "exception"
return 2
else:
print "else"
return 3
finally:
print "finally"
return 4
print "normal return"
return 0
这回跑出来的结果是
exception
finally
4
这也是预期中的结果。
接下来,我将finally里的return拿掉
def trytry():
try:
print 100 / 0
print "no exception"
return 1
except:
print "exception" # point 1
return 2 # point 2
else:
print "else"
return 3
finally:
print "finally" # point 3
print "normal return"
return 0
这回有点意外了,结果是这样:
exception
finally
2
从output可以看到,执行顺序是先跑了 print "exception"
原本应该在这时候return,但它是先到finally跑了 print "finally"
再回到except区块里的return 2,也就是
point 1 -> point 3 -> point 2
如果是执行else的部分也是一样,先跑一趟finally再return
想想虽然是合理,我还是对这种顺序不是很习惯,也只有记着去习惯它了。
--
看了神鵰侠侣,就应该知道年龄不是问题;
看了断背山後,就应该知道性别不是问题;
看了金刚後,就应该明白是不是人也不是问题;
看了倩女幽魂以後,更要知道活不活着都不是问题……
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.251.79.158
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1463989056.A.E6E.html
1F:→ ENEP: 不推荐在try except使用else 05/23 17:16
2F:→ tiefblau: 又return又finally的 感觉有点矛盾 05/23 17:50
3F:推 IKAFIRE: 根据python doc,函式的return value会是执行到的"最後一 05/23 18:03
4F:→ IKAFIRE: 个return value",所以是正常行为 05/23 18:03
5F:→ octantis: else有存在的必要,比起将全部的程式码都放进try,只将 05/23 20:36
6F:→ octantis: 可能出问题的程式码放在try,其他放进else 能一眼看出会 05/23 20:37
7F:→ octantis: 跳出例外的地方 05/23 20:38
8F:推 ripple0129: 我觉得不意外啊,return完process就跳出了,自然是先f 05/23 23:53
9F:→ ripple0129: inally跑过再return 05/23 23:53