7.8. raise 语句

  1. raise_stmt ::= "raise" [expression ["from" expression]]

如果不带表达式,raise 会重新引发当前作用域内最后一个激活的异常。 如果当前作用域内没有激活的异常,将会引发 RuntimeError 来提示错误。

否则的话,raise 会将第一个表达式求值为异常对象。 它必须为 BaseException 的子类或实例。 如果它是一个类,当需要时会通过不带参数地实例化该类来获得异常的实例。

异常的 类型 为异常实例的类, 为实例本身。

当异常被引发时通常会自动创建一个回溯对象并将其关联到可写的 __traceback__ 属性。 你可以创建一个异常并同时使用 with_traceback() 异常方法(该方法将返回同一异常实例,并将回溯对象设为其参数)设置自己的回溯,就像这样:

  1. raise Exception("foo occurred").with_traceback(tracebackobj)

from 子句用于异常串连:如果有该子句,则第二个 表达式 必须为另一个异常或实例,它将作为可写的 __cause__ 属性被关联到所引发的异常。 如果引发的异常未被处理,两个异常都将被打印出来:

  1. >>> try:
  2. ... print(1 / 0)
  3. ... except Exception as exc:
  4. ... raise RuntimeError("Something bad happened") from exc
  5. ...
  6. Traceback (most recent call last):
  7. File "<stdin>", line 2, in <module>
  8. ZeroDivisionError: division by zero
  9. The above exception was the direct cause of the following exception:
  10. Traceback (most recent call last):
  11. File "<stdin>", line 4, in <module>
  12. RuntimeError: Something bad happened

如果一个异常在异常处理器或 finally clause: 中被引发,类似的机制会隐式地发挥作用,之前的异常将被关联到新异常的 __context__ 属性:

  1. >>> try:
  2. ... print(1 / 0)
  3. ... except:
  4. ... raise RuntimeError("Something bad happened")
  5. ...
  6. Traceback (most recent call last):
  7. File "<stdin>", line 2, in <module>
  8. ZeroDivisionError: division by zero
  9. During handling of the above exception, another exception occurred:
  10. Traceback (most recent call last):
  11. File "<stdin>", line 4, in <module>
  12. RuntimeError: Something bad happened

异常串连可通过在 from 子句中指定 None 来显式地加以抑制:

  1. >>> try:
  2. ... print(1 / 0)
  3. ... except:
  4. ... raise RuntimeError("Something bad happened") from None
  5. ...
  6. Traceback (most recent call last):
  7. File "<stdin>", line 4, in <module>
  8. RuntimeError: Something bad happened

有关异常的更多信息可在 异常 一节查看,有关处理异常的信息可在 try 语句 一节查看。

在 3.3 版更改: None 现在允许被用作 raise X from Y 中的 Y

3.3 新版功能: 使用 __suppress_context__ 属性来抑制异常上下文的自动显示。