Python中的raise抛出什么?
看看下面这段代码:
try:
raise Exception("a")
except:
try:
raise Exception("b")
finally:
raise
这段代码会引发一个错误,显示 Exception: a
。我本以为它会引发 Exception: b
(我还需要解释为什么吗?)。那么,最后的 raise
为什么会引发最开始的那个错误,而不是我认为的最后一个错误呢?
2 个回答
29
Raise 是在重新抛出你最后捕获到的异常,而不是你最后自己抛出的异常。
(为了更清楚,这里是从评论中重新发的)
14
在python2.6中
我想,你可能期待“finally”这个部分和你抛出的异常“B”关联在一起,也就是和“try”这个部分连在一起。其实,finally是和第一个“try”块关联的。
如果你在内层的try块中添加了一个except块,那么finally块就会抛出异常B。
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
pass
finally:
raise
输出:
Traceback (most recent call last):
File "test.py", line 5, in <module>
raise Exception("b")
Exception: b
这里还有另一种情况,可以帮助你理解发生了什么
try:
raise Exception("a")
except:
try:
raise Exception("b")
except:
raise
输出:
Traceback (most recent call last):
File "test.py", line 7, in <module>
raise Exception("b")
Exception: b
如果你注意到,这里用except替换finally确实会抛出异常B。