python - __cause__ 和 __context__ 有什么区别?

标签 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

最佳答案

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

另一方面,

__context__ 表示在尝试处理另一个异常时引发了当前异常,并定义了引发此异常时正在处理的异常。这样您就不会丢失其他异常发生的事实(因此在这段代码中抛出异常)——上下文。 X抛出了这个异常,在处理它的同时,Y也抛出了。

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

关于python - __cause__ 和 __context__ 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235932/

相关文章:

python - 在 Python 提示符处引发错误后如何获取最后一个异常对象?

c# - 异常和内存

python - 如何将 yapf 应用于目录下的每个 python 文件?

python - 运行 openmdao 1.7.0 GUI

python - 工作线程不响应主线程的槽调用

python - python中节点图的ASCII可视化

python - 比较两个日期列并验证日期是否早于日期

asp.net-core - 处理 ASP.NET Core 3.1 中未处理的异常

python - 在 ". ","! "或 "? "上拆分字符串,保留标点符号

python - 为什么我要将 python 添加到 PATH