python-peps/pep-0409.txt

97 lines
2.3 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: 2012-01-27
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: