在Python 3中有使用异常链的标准方法吗?

在处理一个例外“ A”的过程中,可能会发生另一例外“ B”。在Python 2.0版本中,如果发生这种情况,则异常B向外传播,而异常A丢失。了解这两种异常对调试问题很有用。

有时,异常处理程序故意重新引发异常是有用的,以提供额外的信息或将异常转换为另一种类型。__cause__属性提供了一种明确的方式来记录异常的直接原因。

异常链接仅在Python 3中可用。Python3具有引发...从子句到链式异常。我们使用raise..from子句重写给定的代码,如下所示

try:
s = {‘a’:1, ‘b’:2}['c']
except KeyError as e:
raise ValueError('failed') from e

默认情况下,Python 3将显示异常处理期间发生的所有异常,如下所示:

Traceback (most recent call last):
File "source_file.py", line 2, in <module>
s = {'a':1, ‘b’:2}['c']
KeyError: 'c'

上面的异常是以下异常的直接原因:

Traceback (most recent call last):
File "source_file.py", line 4, in <module>
raise ValueError('failed') from e
ValueError: failed