[Python-Dev] PEP for allowing 'raise NewException from None'

Ethan Furman ethan at stoneleaf.us
Fri Jan 27 04:19:45 CET 2012


PEP: XXX
Title: Interpreter support for concurrent programming
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:


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /