PEP: XXX
Title: Interpreter support for concurrent programming
Version: $Revision$
Last-Modified: $Date$
Author: Ethan Furman <et...@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:

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to