107 lines
2.3 KiB
Plaintext
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:
|