[問題] 例外處理

看板Python作者 (追風箏的孩子)時間9年前 (2016/04/18 19:49), 9年前編輯推噓4(4026)
留言30則, 5人參與, 最新討論串1/1
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 關鍵字 ? -- 肝不好 肝若好 人生是黑白的 考卷是空白的 、 ﹐ ● ●b ▎ ●> ● ▌ ﹍﹍ 囧> 幹... ▲ ■┘ ▎ ■ ▋ ︶■ 〈﹀ ∥ ▁▁∥ ▎ ﹀〉▊ 〈\ ψcockroach727 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.105 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1460980193.A.B0C.html

04/18 20:03, , 1F
假設你的例外沒有抓到,又沒有finally,JK就不會被執行
04/18 20:03, 1F
我若將 JK 放到和 try,except 的平行位置 不是塞在 except 或是 else 裡面 例外處理完不是一定會經過 ?

04/18 20:05, , 2F
如果你在except裡寫return, finally裡的JK還是會執行
04/18 20:05, 2F

04/18 20:05, , 3F
但放到外面就不會了
04/18 20:05, 3F

04/18 20:06, , 4F
而else的確是不必要(也不常用), 但不是像你說的用 flag
04/18 20:06, 4F

04/18 20:06, , 5F
而且直接寫在try裡 (接在ABCD的後面)
04/18 20:06, 5F

04/18 20:06, , 6F
04/18 20:06, 6F
從官方教學文件 https://docs.python.org/3.4/tutorial/errors.html 抓下的一句話 The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try ... except statement. 好像是不鼓勵將不相關的部分塞進 try 裡面 所以才想到用類似布林運算來處理

04/18 20:30, , 7F
else 就是 if no error 啊,和 while 的 if no break 一樣
04/18 20:30, 7F

04/18 20:30, , 8F
的感覺
04/18 20:30, 8F
※ 編輯: obelisk0114 (140.112.25.105), 04/18/2016 22:12:42

04/18 23:52, , 9F
去跑unhandled exception的流程就知道了
04/18 23:52, 9F
意思是在 except 裡面又發生例外狀況而使得沒放在 finally 裡面的 JK 沒被執行 ? ※ 編輯: obelisk0114 (140.112.25.105), 04/19/2016 20:05:23

04/20 00:13, , 10F
你對else的理解應該沒有錯,可以用flag的方式取代,然
04/20 00:13, 10F

04/20 00:13, , 11F
後else也是如你所引用的那段話:「沒有要被接exception
04/20 00:13, 11F

04/20 00:13, , 12F
的程式碼,放在else裡比放在try裡好」
04/20 00:13, 12F

04/20 00:15, , 13F
至於你文章中說「結果不是也一樣, 那 finally 這個關鍵
04/20 00:15, 13F

04/20 00:15, , 14F
字不是沒有用 ?」那段我不太懂。發生exception的話,路
04/20 00:15, 14F

04/20 00:15, , 15F
徑不就從abcdefgjk變成abcdefghijk了嗎?結果不一樣啊
04/20 00:15, 15F
推文看不懂 若在 C 發生例外,不是會直接跳到 except 部分, D 會執行 ? else 不是只有沒發生例外才會執行 ?

04/20 00:18, , 16F
另外我覺得finally比較重要的是:假設f是raise,代表他
04/20 00:18, 16F

04/20 00:18, , 17F
會reraise exception,那路徑會是abcdefjkxyz(第一份代
04/20 00:18, 17F

04/20 00:18, , 18F
碼)和abcdefxyz(第二份),xyz是這個function的caller接
04/20 00:18, 18F

04/20 00:18, , 19F
exception的代碼
04/20 00:18, 19F
我用下面這段程式執行會跑出 error, raise 可以用在 except 裡面 ? a=1 b=2 c=0 try: print('a/b = ' + str(a/b)) print('------try------') print('a/c = ' + str(a/c)) print('我在 try 裡面') except: print('除以0') print('----except-----') raise else: print('成功') print('------else-----') finally: print('我在 finally 裡面') print('----finally----') print('我沒有歸屬') print('------外面-----') ※ 編輯: obelisk0114 (140.112.25.105), 04/20/2016 19:48:32

04/20 23:27, , 20F
raise丟出一個例外沒有被處理當然會error, 再包一層去
04/20 23:27, 20F

04/20 23:28, , 21F
接就不會了
04/20 23:28, 21F

04/20 23:35, , 22F
就算except裡面沒有raise 你也很難保證你寫在except裡
04/20 23:35, 22F

04/20 23:36, , 23F
的程序不會raise任何非預期的exception
04/20 23:36, 23F

04/20 23:38, , 24F
finally裡面放的是不管中間發生什麼事都要確保被執行的
04/20 23:38, 24F

04/20 23:38, , 25F
code
04/20 23:38, 25F
所以以下例子 try: A B C (可能出現例外 1) D except: E F (可能出現例外 2) G else: H I finally: J K L M 完全正常情況, A->B->C->D->H->I->J->K->L->M 例外 1 出現, 之後正常 A->B->C->E->F->G->J->K->L->M 例外都出現, A->B->C->E->F->J->K-> 程式出現例外,終止 這樣嗎 ? ※ 編輯: obelisk0114 (140.112.25.105), 04/22/2016 12:41:31

04/22 21:08, , 26F
raise可以用在except裡面,意思就是reraise error,讓
04/22 21:08, 26F

04/22 21:08, , 27F
外面的人去處理。例如「d={}; try:print d['x']; excep
04/22 21:08, 27F

04/22 21:08, , 28F
t KeyError: print "error happens"; raise; finally:
04/22 21:08, 28F

04/22 21:08, , 29F
print "something needs to be 收尾 will be in here"
04/22 21:08, 29F

04/22 21:08, , 30F
04/22 21:08, 30F
也就是 finally 是讓程式延後到跑完裡面的內容才終止, 讓外面呼叫他的程式比較容易處理 ? ※ 編輯: obelisk0114 (140.112.25.105), 04/22/2016 21:26:04
文章代碼(AID): #1N5CdXiC (Python)
文章代碼(AID): #1N5CdXiC (Python)