[问题] 例外处理

楼主: 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