python-peps/pep-0409.txt

107 lines
2.3 KiB
Plaintext

PEP: 409
Title: Suppressing exception context
Version: $Revision$
Last-Modified: $Date$
Author: Ethan Furman <ethan@stoneleaf.us>
Status: Draft
Type: Standards Track
Content-Type: text/x-rst
Created: 26-Jan-2012
Python-Version: 3.3
Post-History: 2012-01-27
Abstract
========
One of the open issues from PEP 3134 is suppressing context: currently
there is no way to do it. This PEP proposes one.
Motivation
==========
There are two basic ways to generate exceptions: 1) Python does it
(buggy code, missing resources, ending loops, etc.); and, 2) manually
(with a raise statement).
When writing libraries, or even just custom classes, it can become
necessary to raise exceptions; moreover it can be useful, even
necessary, to change from one exception to another. To take an
example from my dbf module::
try:
value = int(value)
except Exception:
raise DbfError(...)
Whatever the original exception was (ValueError, TypeError, or
something else) is irrelevant. The exception from this point on is a
DbfError, and the original exception is of no value. However, if this
exception is printed, we would currently see both.
Alternatives
============
Several possibilities have been put forth:
- ``raise as NewException()``
Reuses the 'as' keyword; can be confusing since we are not really reraising
the originating exception
- ``raise NewException() from None``
Follows existing syntax of explicitly declaring the originating exception
- ``exc = NewException(); exc.__context__ = None; raise exc``
Very verbose way of the previous method
- ``raise NewException.no_context(...)``
Make context suppression a class method.
All of the above options will require changes to the core.
Proposal
========
I proprose going with the second option::
raise NewException from None
It has the advantage of using the existing pattern of explicitly
setting the cause::
raise KeyError() from NameError()
but because the 'cause' is None the previous context is discarded.
There is a patch to this effect attached to issue 6210 [#issue6210]_.
References
==========
.. [#issue6210]
http://bugs.python.org/issue6210
Copyright
=========
This document has been placed in the public domain.
..
Local Variables:
mode: indented-text
indent-tabs-mode: nil
sentence-end-double-space: t
fill-column: 70
coding: utf-8
End: