[Python-checkins] peps: pep 409: syntax for supressing exception context

benjamin.peterson python-checkins at python.org
Fri Jan 27 16:42:27 CET 2012


http://hg.python.org/peps/rev/f45f0e0c4319
changeset:   4020:f45f0e0c4319
user:        Benjamin Peterson <benjamin at python.org>
date:        Fri Jan 27 10:42:24 2012 -0500
summary:
  pep 409: syntax for supressing exception context

files:
  pep-0409.txt |  96 ++++++++++++++++++++++++++++++++++++++++
  1 files changed, 96 insertions(+), 0 deletions(-)


diff --git a/pep-0409.txt b/pep-0409.txt
new file mode 100644
--- /dev/null
+++ b/pep-0409.txt
@@ -0,0 +1,96 @@
+PEP: 409
+Title: Suppressing exception context
+Version: $Revision$
+Last-Modified: $Date$
+Author: Ethan Furman <ethan at stoneleaf.us>
+Status: Draft
+Type: Standards Track
+Content-Type: text/x-rst
+Created: 26-Jan-2012
+Python-Version: 3.3
+Post-History:
+
+
+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 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:

-- 
Repository URL: http://hg.python.org/peps


More information about the Python-checkins mailing list