__cause__和__context__有什么区别?

时间:2012-06-27 22:58:15

标签: python exception python-3.x

这些是Python异常的属性,但是我无法绕过它们。 Python的文档似乎相当安静。我看了documentation,但我很困惑。那么,两者之间有什么区别?它们是如何使用的?

编辑:就此而言,如果有的话,它们与__traceback__有何关系?

编辑3:我想我只是不理解__cause__。我终于理解了__traceback____context__。为什么attribute_error.__cause__没有引用AttributeError()

try:
    raise NameError() from OSError
except NameError as name_error:
    print('name_error.__cause__: %s' % repr(name_error.__cause__))
    print('name_error.__context__: %s' % repr(name_error.__context__))
    print('name_error.__traceback__: %s' % repr(name_error.__traceback__))
    try:
        raise AttributeError()
    except AttributeError as attribute_error:
        print('attribute_error.__cause__: %s' % repr(attribute_error.__cause__))
        print('attribute_error.__context__: %s' % repr(attribute_error.__context__))
        print('attribute_error.__traceback__: %s' % repr(attribute_error.__traceback__))
        raise attribute_error from IndexError

此输出

name_error.__cause__: OSError()
name_error.__context__: None
name_error.__traceback__: <traceback object at 0x000000000346CAC8>
attribute_error.__cause__: None
attribute_error.__context__: NameError()
attribute_error.__traceback__: <traceback object at 0x000000000346CA88>
Traceback (most recent call last):
  File "C:\test\test.py", line 13, in <module>
    raise attribute_error from IndexError
  File "C:\test\test.py", line 8, in <module>
    raise AttributeError()
AttributeError

1 个答案:

答案 0 :(得分:14)

__cause__是异常的原因 - 由于给定的异常,引发了当前异常。这是一个直接链接 - X抛出了这个异常,因此Y必须抛出此异常。

另一方面,

__context__意味着在尝试处理另一个异常时引发了当前异常,并定义了在引发此异常时正在处理的异常。这样你就不会失去其他异常发生的事实(因此在这个代码中抛出异常) - 上下文。 X抛出这个异常,在处理它时,Y也被扔了。

__traceback__向您显示堆栈 - 为了获取当前代码行而遵循的各种级别的函数。这允许您查明导致异常的原因。可能会使用它(可能与__context__一起使用)来查找导致给定错误的原因。