20

这些是 Python 异常的属性,但我很难理解它们。Python 的文档对此似乎相当安静。我看了看文档,但很困惑。那么,这两者有什么区别,又是如何使用的呢?

编辑:在那张纸条上__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
4

1 回答 1

24

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

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

__traceback__向您展示堆栈 - 为到达当前代码行所遵循的各个级别的函数。这使您可以查明导致异常的原因。它很可能用于(可能与 一起使用__context__)来查找导致给定错误的原因。

于 2012-06-27T23:01:05.840 回答