在Python 3中有使用异常链的标准方法吗?
在处理一个例外“A”的过程中,可能会发生另一例外“B”。在Python2.0版本中,如果发生这种情况,则异常B向外传播,而异常A丢失。了解这两种异常对调试问题很有用。
有时,异常处理程序故意重新引发异常是有用的,以提供额外的信息或将异常转换为另一种类型。__cause__属性提供了一种明确的方式来记录异常的直接原因。
异常链接仅在Python3中可用。Python3具有引发...从子句到链式异常。我们使用raise..from子句重写给定的代码,如下所示
try: s = {‘a’:1, ‘b’:2}['c'] except KeyError as e: raise ValueError('failed') from e
默认情况下,Python3将显示异常处理期间发生的所有异常,如下所示:
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