diff --git a/pep-0409.txt b/pep-0409.txt new file mode 100644 index 000000000..89d31ae4f --- /dev/null +++ b/pep-0409.txt @@ -0,0 +1,96 @@ +PEP: 409 +Title: Suppressing exception context +Version: $Revision$ +Last-Modified: $Date$ +Author: Ethan Furman +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: