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