skip to navigation
skip to content

Python Wiki

Python Insider Blog

Python 2 or 3?

Help Fund Python

[Python resources in languages other than English]

Non-English Resources

Add an event to this calendar.

Times are shown in UTC/GMT.

Add an event to this calendar.

PEP:415
Title:Implement context suppression with exception attributes
Version:630a00e4f19b
Last-Modified:2012-05-15 21:53:25 +1000 (Tue, 15 May 2012)
Author:Benjamin Peterson <benjamin at python.org>
BDFL-Delegate:Nick Coghlan
Status:Final
Type:Standards Track
Content-Type:text/x-rst
Created:26-Feb-2012
Python-Version:3.3
Post-History:26-Feb-2012
Replaces:409
Resolution:http://mail.python.org/pipermail/python-dev/2012-May/119467.html

Abstract

PEP 409 introduced support for the raise exc from None construct to allow the display of the exception context to be explicitly suppressed. This PEP retains the language level changes already implemented in PEP 409, but replaces the underlying implementation mechanism with a simpler approach based on a new __suppress_context__ attribute on all BaseException instances.

PEP Acceptance

This PEP was accepted by Nick Coghlan on the 14th of May, 2012.

Rationale

PEP 409 changes __cause__ to be Ellipsis by default. Then if __cause__ is set to None by raise exc from None, no context or cause will be printed should the exception be uncaught.

The main problem with this scheme is it complicates the role of __cause__. __cause__ should indicate the cause of the exception not whether __context__ should be printed or not. This use of __cause__ is also not easily extended in the future. For example, we may someday want to allow the programmer to select which of __context__ and __cause__ will be printed. The PEP 409 implementation is not amenable to this.

The use of Ellipsis is a hack. Before PEP 409, Ellipsis was used exclusively in extended slicing. Extended slicing has nothing to do with exceptions, so it's not clear to someone inspecting an exception object why __cause__ should be set to Ellipsis. Using Ellipsis by default for __cause__ makes it asymmetrical with __context__.

Proposal

A new attribute on BaseException, __suppress_context__, will be introduced. Whenever __cause__ is set, __suppress_context__ will be set to True. In particular, raise exc from cause syntax will set exc.__suppress_context__ to True. Exception printing code will check for that attribute to determine whether context and cause will be printed. __cause__ will return to its original purpose and values.

There is precedence for __suppress_context__ with the print_line_and_file exception attribute.

To summarize, raise exc from cause will be equivalent to:

exc.__cause__ = cause
raise exc

where exc.__cause__ = cause implicitly sets exc.__suppress_context__.

Patches

There is a patch on Issue 14133 [1].