重新提出例外情况

有时你只是为了检查它而捕获异常,例如用于记录目的。检查后,你希望异常继续像之前一样传播。

在这种情况下,只需使用没有参数的 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