[Python-Dev] PEP for allowing 'raise NewException from None' (original) (raw)

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


PEP: XXX Title: Interpreter support for concurrent programming Version: RevisionRevisionRevision Last-Modified: DateDateDate 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:

reraising the originating exception

exception

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