Python 中的 raise
和 raise 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/