• 7.8. raise 语句

    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.  
    10. The above exception was the direct cause of the following exception:
    11.  
    12. Traceback (most recent call last):
    13. File "<stdin>", line 4, in <module>
    14. 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.  
    10. During handling of the above exception, another exception occurred:
    11.  
    12. Traceback (most recent call last):
    13. File "<stdin>", line 4, in <module>
    14. 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 属性来抑制异常上下文的自动显示。