这些是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__表示当前异常是在try 处理另一个异常时引发的,并定义了在引发此异常时正在处理的异常.这样,您就不会丢失其他异常发生的事实(因此我们在这段代码中抛出了异常)——上下文.X抛出了这个异常,在处理它的同时,Y也被抛出.

__traceback__向您展示了堆栈——为获得当前代码行而遵循的各种级别的函数.这使您能够查明异常的原因.它很可能被用来(可能与__context__结合使用)查找导致给定错误的原因.

Python-3.x相关问答推荐

网站抓取:当我使用Chrome DevTools中的网络选项卡时,找不到正确的URL来提供我想要的数据

为什么我的Selenium脚本在密码元素上失败?

CDKTF ec2 具有特定私有 IP 地址的娱乐

如何立即从asyncio.Task获取异常?

「Python Pandas」多级索引列和行匹配,如果列和行名称相似,则排除这些单元格中的值添加

TypeError: issubclass() arg 1 在 Flask 中导入 langchain 时必须是一个类

python2和python3中的列表生成器

python 3.10.5 中可能存在的错误. id 函数工作不明确

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

将字典列表展平为数据框列

在 jupyter notebook 的单元格中使用 sudo

为什么Pandas会在 NaN 上合并?

Generic[T] 基类 - 如何从实例中获取 T 的类型?

为 python3 安装 opencv

sys.stdin.readline() 和 input():读取输入行时哪个更快,为什么?

如何配置 Atom 以运行 Python3 脚本?

如何使用 asyncio 添加连接超时?

如何将numpy数组图像转换为字节?

使用 Tensorflow 2.0 在 MNIST 上实现自定义神经网络?

如何避免使用我的 python 包构建 C 库?