[閒聊] 最近學了try/except/else/finally

看板Python作者 (雪梅)時間8年前 (2016/05/23 15:37), 編輯推噓2(207)
留言9則, 5人參與, 最新討論串1/1
大家都知道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
不推薦在try except使用else
05/23 17:16, 1F

05/23 17:50, , 2F
又return又finally的 感覺有點矛盾
05/23 17:50, 2F

05/23 18:03, , 3F
根據python doc,函式的return value會是執行到的"最後一
05/23 18:03, 3F

05/23 18:03, , 4F
個return value",所以是正常行為
05/23 18:03, 4F

05/23 20:36, , 5F
else有存在的必要,比起將全部的程式碼都放進try,只將
05/23 20:36, 5F

05/23 20:37, , 6F
可能出問題的程式碼放在try,其他放進else 能一眼看出會
05/23 20:37, 6F

05/23 20:38, , 7F
跳出例外的地方
05/23 20:38, 7F

05/23 23:53, , 8F
我覺得不意外啊,return完process就跳出了,自然是先f
05/23 23:53, 8F

05/23 23:53, , 9F
inally跑過再return
05/23 23:53, 9F
文章代碼(AID): #1NGhD0vk (Python)