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发布于 2014-07-15 15:44:53
不同之处在于,当您使用from时,将设置__cause__属性,并且消息指出异常是由直接引起的。如果省略了from,则不会设置__cause__,但也可以设置__context__属性,然后回溯会在处理其他事件时显示上下文。
如果在异常处理程序中使用raise,则会设置__context__;如果在其他任何地方使用raise,也不会设置__context__。
如果设置了__cause__,则还会在异常上设置__suppress_context__ = True标志;当__suppress_context__设置为True时,在打印回溯时将忽略__context__。
当从不想显示上下文的异常处理程序引发异常(不希望在处理另一个发生异常的消息时)时,请使用raise ... from None将__suppress_context__设置为True。
换句话说,Python设置了异常的上下文,这样您就可以自省异常发生在哪里,让您看到另一个异常是否被它替换了。您还可以向异常添加原因,使另一个异常的回溯显式显示(使用不同的措辞),并且忽略上下文(但在调试时仍然可以自省)。使用raise ... from None可以禁止打印上下文。
请参阅raise statement documenation
from子句用于异常链接:如果给定,第二个表达式必须是另一个异常类或实例,然后将其作为__cause__属性附加到引发的异常(该属性是可写的)。如果引发的异常未得到处理,则两个异常都将为printed:try:...打印(1/ 0) ...异常例外,如exc:...从exc中引发RuntimeError(“发生了不好的事情”) ...Traceback (最近一次调用):文件"",第2行,在ZeroDivisionError中:整除或以零为模上述异常是以下异常的直接原因: Traceback (最近一次调用):文件"",第4行,在RuntimeError中:发生了一些不好的事情
如果在异常处理程序或finally子句中引发异常,则会隐式地使用类似的机制:然后将前一个异常附加为新异常的__context__属性:
尝试:...打印(1/ 0) ...除了:...引发RuntimeError(“发生了不好的事情”) ...happened (最近一次调用):文件"",第2行,in ZeroDivisionError:整除或以零为模在处理上述异常的过程中,出现了另一个异常: Traceback (最近一次调用):文件"",第4行,位于RuntimeError: Something bad the
另请参阅Built-in Exceptions documentation,了解附加到异常的上下文和原因信息的详细信息。
https://stackoverflow.com/questions/24752395
复制相似问题