Python 中的 raiseraise from 有什么区别?

try:
    raise ValueError
except Exception as e:
    raise IndexError

这产生
Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError
IndexError


try:
    raise ValueError
except Exception as e:
    raise IndexError from e

这产生
Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError from e
IndexError

最佳答案

不同之处在于,当您使用 from 时,会设置 __cause__ 属性,并且消息指出异常是由直接引起的。如果省略 from,则不会设置 __cause__,但也可以设置 __context__ 属性,然后回溯会显示上下文,就像在处理其他事情时一样。
如果您在异常处理程序中使用 __context__,则会设置 raise;如果您在其他任何地方使用 raise 也没有设置 __context__
如果设置了 __cause__,则异常也会设置 __suppress_context__ = True 标志;当 __suppress_context__ 设置为 True 时,打印回溯时会忽略 __context__
当从您不想显示上下文的异常处理程序引发时(在处理另一个异常发生的消息期间不想要一个),然后使用 raise ... from None__suppress_context__ 设置为 True
换句话说,Python 为异常设置了一个上下文,以便您可以自省(introspection)引发异常的位置,让您查看是否有另一个异常被它替换。您还可以为异常添加原因,使回溯明确关于另一个异常(使用不同的措辞),并且上下文被忽略(但在调试时仍然可以自省(introspection))。使用 raise ... from None 可以抑制正在打印的上下文。
raise statement documenation :

另请参阅 Built-in Exceptions documentation 以获取有关附加到异常的上下文和原因信息的详细信息。

关于Python "raise from"用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24752395/

10-13 09:08