作者obelisk0114 (追风筝的孩子)
看板Python
标题[问题] 例外处理
时间Mon Apr 18 19:49:43 2016
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 囧 ▎ ●> ● ◤
▌ ﹍﹍ 0 ▊囧>
干...
▲ ■┘ ■ ▎ ■ █◤ ▌ ㄏ▋ ︶■
〈﹀ ∥ ▁▁∥ ▎ ﹀〉◤
▋ ▊ 〈\
ψcockroach727
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.112.25.105
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1460980193.A.B0C.html
1F:推 IKAFIRE: 假设你的例外没有抓到,又没有finally,JK就不会被执行 04/18 20:03
我若将 JK 放到和 try,except 的平行位置
不是塞在 except 或是 else 里面
例外处理完不是一定会经过 ?
2F:→ bibo9901: 如果你在except里写return, finally里的JK还是会执行 04/18 20:05
3F:→ bibo9901: 但放到外面就不会了 04/18 20:05
4F:→ bibo9901: 而else的确是不必要(也不常用), 但不是像你说的用 flag 04/18 20:06
5F:→ bibo9901: 而且直接写在try里 (接在ABCD的後面) 04/18 20:06
6F:→ 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 里面
所以才想到用类似布林运算来处理
7F:推 eight0: else 就是 if no error 啊,和 while 的 if no break 一样 04/18 20:30
8F:→ eight0: 的感觉 04/18 20:30
※ 编辑: obelisk0114 (140.112.25.105), 04/18/2016 22:12:42
9F:→ IKAFIRE: 去跑unhandled exception的流程就知道了 04/18 23:52
意思是在 except 里面又发生例外状况而使得没放在 finally 里面的 JK 没被执行 ?
※ 编辑: obelisk0114 (140.112.25.105), 04/19/2016 20:05:23
10F:→ jenny2921: 你对else的理解应该没有错,可以用flag的方式取代,然 04/20 00:13
11F:→ jenny2921: 後else也是如你所引用的那段话:「没有要被接exception 04/20 00:13
12F:→ jenny2921: 的程式码,放在else里比放在try里好」 04/20 00:13
13F:→ jenny2921: 至於你文章中说「结果不是也一样, 那 finally 这个关键 04/20 00:15
14F:→ jenny2921: 字不是没有用 ?」那段我不太懂。发生exception的话,路 04/20 00:15
15F:→ jenny2921: 径不就从abcdefgjk变成abcdefghijk了吗?结果不一样啊 04/20 00:15
推文看不懂
若在 C 发生例外,不是会直接跳到 except 部分, D 会执行 ?
else 不是只有没发生例外才会执行 ?
16F:→ jenny2921: 另外我觉得finally比较重要的是:假设f是raise,代表他 04/20 00:18
17F:→ jenny2921: 会reraise exception,那路径会是abcdefjkxyz(第一份代 04/20 00:18
18F:→ jenny2921: 码)和abcdefxyz(第二份),xyz是这个function的caller接 04/20 00:18
19F:→ 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
20F:推 mantour: raise丢出一个例外没有被处理当然会error, 再包一层去 04/20 23:27
21F:→ mantour: 接就不会了 04/20 23:28
22F:推 mantour: 就算except里面没有raise 你也很难保证你写在except里 04/20 23:35
23F:→ mantour: 的程序不会raise任何非预期的exception 04/20 23:36
24F:→ mantour: finally里面放的是不管中间发生什麽事都要确保被执行的 04/20 23:38
25F:→ 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
26F:→ jenny2921: raise可以用在except里面,意思就是reraise error,让 04/22 21:08
27F:→ jenny2921: 外面的人去处理。例如「d={}; try:print d['x']; excep 04/22 21:08
28F:→ jenny2921: t KeyError: print "error happens"; raise; finally: 04/22 21:08
29F:→ jenny2921: print "something needs to be 收尾 will be in here" 04/22 21:08
30F:→ jenny2921: 」 04/22 21:08
也就是 finally 是让程式延後到跑完里面的内容才终止,
让外面呼叫他的程式比较容易处理 ?
※ 编辑: obelisk0114 (140.112.25.105), 04/22/2016 21:26:04