Python“提高”用法
在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__
属性被设置,并且消息指出exception是直接引起的 。 如果你忽略了那个from
那么没有__cause__
被设置,但是__context__
属性也可以被设置,并且跟踪将在处理其他事情时显示上下文。
如果在exception处理程序中使用raise
,则会发生__context__
设置; 如果您在其他地方使用了raise
不会设置__context__
。
如果设置了__suppress_context__ = True
,则exception也会设置__suppress_context__ = True
标志; 当__suppress_context__
设置为True
时,打印回溯时将忽略__context__
。
当从不希望显示上下文的exception处理程序中引发exception时(不想在处理另一个exception时发生消息),然后使用raise ... from None
将__suppress_context__
设置为True
。
换句话说,Python为exception设置了一个上下文 ,这样您就可以反省引发exception的位置,让您看看是否有另一个exception被replace。 您还可以将一个原因添加到exception,使其他exception(使用不同的措辞)显式回溯,上下文被忽略(但仍然可以在debugging时进行内省)。 raise ... from None
使用raise ... from None
可以抑制正在打印的上下文。
见raise
声明文件 :
from
子句用于exception链接:如果给定,则第二个expression式必须是另一个exception类或实例,然后将其作为__cause__
属性(可写)附加到引发的exception。 如果没有处理引发的exception,则将打印两个exception:>>> try: ... print(1 / 0) ... except Exception as exc: ... raise RuntimeError("Something bad happened") from exc ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
如果在exception处理程序中引发exception,则类似的机制隐式工作:>之前的exception作为新exception的
__context__
属性附加:>>> try: ... print(1 / 0) ... except: ... raise RuntimeError("Something bad happened") ... Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: int division or modulo by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "<stdin>", line 4, in <module> RuntimeError: Something bad happened
另请参阅内置的例外文档 ,了解有关例外的上下文和原因信息的详细信息。