[閒聊] 最近學了try/except/else/finally
大家都知道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://www.ptt.cc/bbs/Python/M.1463989056.A.E6E.html
→
05/23 17:16, , 1F
05/23 17:16, 1F
→
05/23 17:50, , 2F
05/23 17:50, 2F
推
05/23 18:03, , 3F
05/23 18:03, 3F
→
05/23 18:03, , 4F
05/23 18:03, 4F
→
05/23 20:36, , 5F
05/23 20:36, 5F
→
05/23 20:37, , 6F
05/23 20:37, 6F
→
05/23 20:38, , 7F
05/23 20:38, 7F
推
05/23 23:53, , 8F
05/23 23:53, 8F
→
05/23 23:53, , 9F
05/23 23:53, 9F