pep 409: syntax for supressing exception context

This commit is contained in:
Benjamin Peterson 2012-01-27 10:42:24 -05:00
parent 78394bdb71
commit 7b8143df58
1 changed files with 96 additions and 0 deletions

96
pep-0409.txt Normal file
View File

@ -0,0 +1,96 @@
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:
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: