Python中的raise语句用于抛出一个指定的异常。当程序中出现错误或需要中断执行时,可以使用raise语句来引发一个异常,并附带一些描述信息。这样可以让调用者知道发生了什么错误,以便进行相应的处理。
一、raise语句语法
raise_stmt ::= "raise" [expression ["from" expression]]
raise语句用于抛出一个指定的异常。如果没有提供表达式,则raise会重新引发当前正在处理的异常,也被称为活动的异常。如果当前没有活动的异常,则会引发RuntimeError来提示发生了错误。否则的话,raise会将第一个表达式求值为异常对象。它必须为BaseException的子类或实例。
如果它是一个类,当需要时会通过不带参数地实例化该类来获得异常的实例。异常的类型为异常实例的类,值为实例本身。当有异常被引发时通常会自动创建一个回溯对象并将其关联到它的__traceback__属性,该属性是可写的。
可以创建一个异常并使用with_traceback()异常方法(该方法将返回同一异常实例,并将回溯对象设为其参数)直接设置自己的回溯对象,就像这样:
raise Exception("foo occurred").with_traceback(tracebackobj)
二、from子句
from子句用于异常串连,如果有该子句,则第二个表达式必须为另一个异常类或实例。 如果第二个表达式是一个异常实例,它将作为可写的 __cause__ 属性被关联到所引发的异常。 如果该表达式是一个异常类,这个类将被实例化且所生成的异常实例将作为 __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
三、新的异常处理
当已经有一个异常在处理时如果有新的异常被引发则类似的机制会隐式地起作用。 异常可以通过使用 except 或 finally 子句或是 with 语句来处理。 之前的异常将被关联至新异常的 __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>
四、异常串连
异常串连可通过在 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