重新提出例外情況

有時你只是為了檢查它而捕獲異常,例如用於記錄目的。檢查後,你希望異常繼續像之前一樣傳播。

在這種情況下,只需使用沒有引數的 raise 語句。

try:
    5 / 0
except ZeroDivisionError:
    print("Got an error")
    raise

但請記住,呼叫者堆疊中的某個人仍可以捕獲異常並以某種方式處理它。在這種情況下,完成的輸出可能是令人討厭的,因為它會在任何情況下發生(捕獲或未捕獲)。因此,提出一個不同的異常可能是一個更好的主意,包含你對該情況的評論以及原始異常:

try:
    5 / 0
except ZeroDivisionError as e:
    raise ZeroDivisionError("Got an error", e)

但是這樣做的缺點是將異常跟蹤減少到這個 raise,而沒有引數的 raise 保留了原始的異常跟蹤。

在 Python 3 中,你可以使用 raise-from 語法保留原始堆疊:

    raise ZeroDivisionError("Got an error") from e