Python“提高”用法

在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__属性被设置,并且消息指出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 

另请参阅内置的例外文档 ,了解有关例外的上下文和原因信息的详细信息。