[問題] 例外處理

作者: obelisk0114 (追風箏的孩子)   2016-04-18 19:49:43
python 的例外處理會用到的關鍵字:
try, except, else, finally
後面 2個關鍵字好像可以不用存在 ?
例如:
try:
A
B
C (出現例外)
D
except:
E
F
G
else:
H
I
finally:
J
K
正常情形下,
應該是 A->B->C->D->H->I->J->K
出現例外,
則是 A->B->C->E->F->G->J->K
假如我將程式碼改成
try:
A
B
C (出現例外)
D
except:
E
F
G
else:
H
I
J
K
結果不是也一樣, 那 finally 這個關鍵字不是沒有用 ?
else 好像也可以不用, 只要預先設立一個flag
在 try 裡面設為 true, except 則為 false
在 J, K 前面加上 if(flag):
這樣不是也不用 else 關鍵字 ?
作者: IKAFIRE (沒有)   2016-04-18 20:03:00
假設你的例外沒有抓到,又沒有finally,JK就不會被執行
作者: bibo9901 (function(){})()   2016-04-18 20:05:00
如果你在except裡寫return, finally裡的JK還是會執行但放到外面就不會了而else的確是不必要(也不常用), 但不是像你說的用 flag而且直接寫在try裡 (接在ABCD的後面)是
作者: eight0 (欸XD)   2016-04-18 20:30:00
else 就是 if no error 啊,和 while 的 if no break 一樣的感覺
作者: IKAFIRE (沒有)   2016-04-18 23:52:00
去跑unhandled exception的流程就知道了
作者: jenny2921 ( )   2016-04-20 00:13:00
你對else的理解應該沒有錯,可以用flag的方式取代,然後else也是如你所引用的那段話:「沒有要被接exception的程式碼,放在else裡比放在try裡好」至於你文章中說「結果不是也一樣, 那 finally 這個關鍵字不是沒有用 ?」那段我不太懂。發生exception的話,路徑不就從abcdefgjk變成abcdefghijk了嗎?結果不一樣啊另外我覺得finally比較重要的是:假設f是raise,代表他會reraise exception,那路徑會是abcdefjkxyz(第一份代碼)和abcdefxyz(第二份),xyz是這個function的caller接exception的代碼
作者: mantour (朱子)   2016-04-20 23:27:00
raise丟出一個例外沒有被處理當然會error, 再包一層去接就不會了就算except裡面沒有raise 你也很難保證你寫在except裡的程序不會raise任何非預期的exceptionfinally裡面放的是不管中間發生什麼事都要確保被執行的code
作者: jenny2921 ( )   2016-04-22 21:08:00
raise可以用在except裡面,意思就是reraise error,讓外面的人去處理。例如「d={}; try:print d['x']; except KeyError: print "error happens"; raise; finally:print "something needs to be 收尾 will be in here"」

Links booklink

Contact Us: admin [ a t ] ucptt.com