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。然后,如果 raise exc from None 将 __cause__ 设置为 None,那么如果异常未被捕获,将不会打印上下文或原因。
该方案的主要问题是它使 __cause__ 的作用复杂化了。__cause__ 应该指示异常的原因,而不是指示是否应打印 __context__。这种对 __cause__ 的使用在未来也不容易扩展。例如,我们可能有一天希望允许程序员选择打印 __context__ 和 __cause__ 中的哪一个。PEP 409 的实现不适合此目的。
使用 Ellipsis 是一种 HACK。在 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__。
补丁
Issue 14133 上有一个补丁。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0415.rst