Python中的raise抛出什么?

33 投票
2 回答
15669 浏览
提问于 2025-04-16 05:30

看看下面这段代码:

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。

撰写回答