Python中提升的内容是什么?

wil*_*ell 30 python exception

请考虑以下代码:

try:
    raise Exception("a")
except:
    try:
        raise Exception("b")
    finally:
        raise
Run Code Online (Sandbox Code Playgroud)

这会提高Exception: a.我预计它会提高Exception: b(我需要解释原因吗?).为什么最终raise提出原始异常而不是(我认为)是最后一个异常引发的?

Fal*_*rri 27

Raise正在重新引发您捕获的最后一个异常,而不是您引发的最后一个异常

(为澄清而转自评论)


pyf*_*unc 14

在python2.6上

我猜,你期望finally块与"try"块绑在一起,你可以在其中引发异常"B".finally块附加到第一个"try"块.

如果在内部try块中添加了except块,那么finally块将引发异常B.

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    pass
  finally:
    raise
Run Code Online (Sandbox Code Playgroud)

输出:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    raise Exception("b")
Exception: b
Run Code Online (Sandbox Code Playgroud)

另一种变化解释了这里发生的事情

try:
  raise Exception("a")
except:
  try:
    raise Exception("b")
  except:
    raise
Run Code Online (Sandbox Code Playgroud)

输出:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    raise Exception("b")
Exception: b
Run Code Online (Sandbox Code Playgroud)

如果你看到这里,用except替换finally块会引发异常B.

  • wilhelmtell:`raise`重新提升你捕获的最后一个异常,而不是你提出的最后一个异常.如果你在抛出一个异常后自己尝试`raise`并且之前没有遇到任何异常,那么你将得到一个TypeError,因为没有什么可以重新加注. (12认同)