7.8. raise
语句
- raise_stmt ::= "raise" [
expression
["from"expression
]]
如果不带表达式,raise
会重新引发当前作用域内最后一个激活的异常。 如果当前作用域内没有激活的异常,将会引发 RuntimeError
来提示错误。
否则的话,raise
会将第一个表达式求值为异常对象。 它必须为 BaseException
的子类或实例。 如果它是一个类,当需要时会通过不带参数地实例化该类来获得异常的实例。
异常的 类型 为异常实例的类,值 为实例本身。
当异常被引发时通常会自动创建一个回溯对象并将其关联到可写的 __traceback__
属性。 你可以创建一个异常并同时使用 with_traceback()
异常方法(该方法将返回同一异常实例,并将回溯对象设为其参数)设置自己的回溯,就像这样:
raise Exception("foo occurred").with_traceback(tracebackobj)
from
子句用于异常串连:如果有该子句,则第二个 表达式 必须为另一个异常或实例,它将作为可写的 __cause__
属性被关联到所引发的异常。 如果引发的异常未被处理,两个异常都将被打印出来:
>>> 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: division 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
如果一个异常在异常处理器或 finally
clause: 中被引发,类似的机制会隐式地发挥作用,之前的异常将被关联到新异常的 __context__
属性:
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened")
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division 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
异常串连可通过在 from
子句中指定 None
来显式地加以抑制:
>>> try:
... print(1 / 0)
... except:
... raise RuntimeError("Something bad happened") from None
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
RuntimeError: Something bad happened
有关异常的更多信息可在 异常 一节查看,有关处理异常的信息可在 try 语句 一节查看。
在 3.3 版更改: None
现在允许被用作 raise X from Y
中的 Y
。
3.3 新版功能: 使用 __suppress_context__
属性来抑制异常上下文的自动显示。