pep 409: syntax for supressing exception context
This commit is contained in:
parent
78394bdb71
commit
7b8143df58
|
@ -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:
|
Loading…
Reference in New Issue