Python中的raise語句用于拋出一個指定的異常。當(dāng)程序中出現(xiàn)錯誤或需要中斷執(zhí)行時,可以使用raise語句來引發(fā)一個異常,并附帶一些描述信息。這樣可以讓調(diào)用者知道發(fā)生了什么錯誤,以便進(jìn)行相應(yīng)的處理。
一、raise語句語法
raise_stmt ::= "raise" [expression ["from" expression]]
raise語句用于拋出一個指定的異常。如果沒有提供表達(dá)式,則raise會重新引發(fā)當(dāng)前正在處理的異常,也被稱為活動的異常。如果當(dāng)前沒有活動的異常,則會引發(fā)RuntimeError來提示發(fā)生了錯誤。否則的話,raise會將第一個表達(dá)式求值為異常對象。它必須為BaseException的子類或?qū)嵗?/p>
如果它是一個類,當(dāng)需要時會通過不帶參數(shù)地實(shí)例化該類來獲得異常的實(shí)例。異常的類型為異常實(shí)例的類,值為實(shí)例本身。當(dāng)有異常被引發(fā)時通常會自動創(chuàng)建一個回溯對象并將其關(guān)聯(lián)到它的__traceback__屬性,該屬性是可寫的。
可以創(chuàng)建一個異常并使用with_traceback()異常方法(該方法將返回同一異常實(shí)例,并將回溯對象設(shè)為其參數(shù))直接設(shè)置自己的回溯對象,就像這樣:
raise Exception("foo occurred").with_traceback(tracebackobj)
二、from子句
from子句用于異常串連,如果有該子句,則第二個表達(dá)式必須為另一個異常類或?qū)嵗?如果第二個表達(dá)式是一個異常實(shí)例,它將作為可寫的 __cause__ 屬性被關(guān)聯(lián)到所引發(fā)的異常。 如果該表達(dá)式是一個異常類,這個類將被實(shí)例化且所生成的異常實(shí)例將作為 __cause__ 屬性被關(guān)聯(lián)到所引發(fā)的異常。
如果所引發(fā)的異常未被處理,則兩個異常都將被打印出來:
>>>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
三、新的異常處理
當(dāng)已經(jīng)有一個異常在處理時如果有新的異常被引發(fā)則類似的機(jī)制會隱式地起作用。 異??梢酝ㄟ^使用 except 或 finally 子句或是 with 語句來處理。 之前的異常將被關(guān)聯(lián)至新異常的 __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