这些是 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
最佳答案
__cause__
是异常的原因 - 由于给定的异常,引发了当前异常。这是直接链接 - X 抛出此异常,因此 Y 必须抛出此异常。
__context__
表示在尝试处理另一个异常时引发了当前异常,并定义了引发此异常时正在处理的异常。这样您就不会丢失其他异常发生的事实(因此在这段代码中抛出异常)——上下文。 X抛出了这个异常,在处理它的同时,Y也抛出了。
__traceback__
向您显示堆栈 - 到达当前代码行所遵循的各个级别的函数。这使您可以查明导致异常的原因。它很可能用于(可能与 __context__
一起使用)来查找导致给定错误的原因。
关于python - __cause__ 和 __context__ 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235932/