Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

PEP 415 – 使用异常属性实现上下文抑制

作者:
Benjamin Peterson <benjamin at python.org>
BDFL 代表:
Alyssa Coghlan
状态:
最终
类型:
标准轨迹
创建:
2012 年 2 月 26 日
Python 版本:
3.3
发布历史:
2012 年 2 月 26 日
替换:
409
决议:
Python-Dev 消息

目录

摘要

PEP 409 引入了对 raise exc from None 结构的支持,以允许显式抑制异常上下文的显示。此 PEP 保留了 PEP 409 中已实现的语言级更改,但将底层实现机制替换为基于所有 BaseException 实例上的新 __suppress_context__ 属性的更简单的方法。

PEP 接受

此 PEP 于 2012 年 5 月 14 日由 Alyssa Coghlan 接受。

基本原理

PEP 409__cause__ 更改为默认情况下为 Ellipsis。然后,如果 __cause__raise exc from None 设置为 None,则如果异常未捕获,则不会打印任何上下文或原因。

此方案的主要问题在于它使 __cause__ 的作用变得复杂。 __cause__ 应该指示异常的原因,而不是 __context__ 是否应该打印。这种使用 __cause__ 的方法在将来也不易扩展。例如,我们可能将来希望允许程序员选择打印 __context____cause__ 中的哪一个。 PEP 409 的实现对此并不适用。

使用 Ellipsis 是一种变通方法。在 PEP 409 之前,Ellipsis 专门用于扩展切片。扩展切片与异常无关,因此对于检查异常对象的人员来说,不清楚为什么 __cause__ 应该设置为 Ellipsis。对于 __cause__ 使用 Ellipsis 作为默认值使其与 __context__ 不对称。

提案

将引入一个新的 BaseException 属性 __suppress_context__。每当设置 __cause__ 时,__suppress_context__ 将被设置为 True。特别是,raise exc from cause 语法将 exc.__suppress_context__ 设置为 True。异常打印代码将检查该属性以确定是否打印上下文和原因。 __cause__ 将恢复其原始用途和值。

__suppress_context__print_line_and_file 异常属性的先例。

概括地说,raise exc from cause 等价于

exc.__cause__ = cause
raise exc

其中 exc.__cause__ = cause 隐式设置 exc.__suppress_context__

补丁

问题 14133 上有一个补丁。


来源:https://github.com/python/peps/blob/main/peps/pep-0415.rst

上次修改:2023-10-11 12:05:51 GMT