看板 Python 關於我們 聯絡資訊
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
IKAFIRE: 假設你的例外沒有抓到,又沒有finally,JK就不會被執行 04/18 20:03
我若將 JK 放到和 try,except 的平行位置 不是塞在 except 或是 else 裡面 例外處理完不是一定會經過 ?
bibo9901: 如果你在except裡寫return, finally裡的JK還是會執行 04/18 20:05
bibo9901: 但放到外面就不會了 04/18 20:05
bibo9901: 而else的確是不必要(也不常用), 但不是像你說的用 flag 04/18 20:06
bibo9901: 而且直接寫在try裡 (接在ABCD的後面) 04/18 20:06
bibo9901: 是 04/18 20:06
從官方教學文件 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 裡面 所以才想到用類似布林運算來處理
eight0: else 就是 if no error 啊,和 while 的 if no break 一樣 04/18 20:30
eight0: 的感覺 04/18 20:30
※ 編輯: obelisk0114 (140.112.25.105), 04/18/2016 22:12:42
IKAFIRE: 去跑unhandled exception的流程就知道了 04/18 23:52
意思是在 except 裡面又發生例外狀況而使得沒放在 finally 裡面的 JK 沒被執行 ? ※ 編輯: obelisk0114 (140.112.25.105), 04/19/2016 20:05:23
jenny2921: 你對else的理解應該沒有錯,可以用flag的方式取代,然 04/20 00:13
jenny2921: 後else也是如你所引用的那段話:「沒有要被接exception 04/20 00:13
jenny2921: 的程式碼,放在else裡比放在try裡好」 04/20 00:13
jenny2921: 至於你文章中說「結果不是也一樣, 那 finally 這個關鍵 04/20 00:15
jenny2921: 字不是沒有用 ?」那段我不太懂。發生exception的話,路 04/20 00:15
jenny2921: 徑不就從abcdefgjk變成abcdefghijk了嗎?結果不一樣啊 04/20 00:15
推文看不懂 若在 C 發生例外,不是會直接跳到 except 部分, D 會執行 ? else 不是只有沒發生例外才會執行 ?
jenny2921: 另外我覺得finally比較重要的是:假設f是raise,代表他 04/20 00:18
jenny2921: 會reraise exception,那路徑會是abcdefjkxyz(第一份代 04/20 00:18
jenny2921: 碼)和abcdefxyz(第二份),xyz是這個function的caller接 04/20 00:18
jenny2921: exception的代碼 04/20 00:18
我用下面這段程式執行會跑出 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
mantour: raise丟出一個例外沒有被處理當然會error, 再包一層去 04/20 23:27
mantour: 接就不會了 04/20 23:28
mantour: 就算except裡面沒有raise 你也很難保證你寫在except裡 04/20 23:35
mantour: 的程序不會raise任何非預期的exception 04/20 23:36
mantour: finally裡面放的是不管中間發生什麼事都要確保被執行的 04/20 23:38
mantour: code 04/20 23:38
所以以下例子 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
jenny2921: raise可以用在except裡面,意思就是reraise error,讓 04/22 21:08
jenny2921: 外面的人去處理。例如「d={}; try:print d['x']; excep 04/22 21:08
jenny2921: t KeyError: print "error happens"; raise; finally: 04/22 21:08
jenny2921: print "something needs to be 收尾 will be in here" 04/22 21:08
jenny2921: 」 04/22 21:08
也就是 finally 是讓程式延後到跑完裡面的內容才終止, 讓外面呼叫他的程式比較容易處理 ? ※ 編輯: obelisk0114 (140.112.25.105), 04/22/2016 21:26:04