[Python-checkins] r54879 - peps/trunk/pep-0352.txt (original) (raw)

brett.cannon python-checkins at python.org
Thu Apr 19 21:05:18 CEST 2007


Author: brett.cannon Date: Thu Apr 19 21:05:14 2007 New Revision: 54879

Modified: peps/trunk/pep-0352.txt Log: Update PEP to cover the deprecation of BaseException.message in Python 2.6.

Modified: peps/trunk/pep-0352.txt

--- peps/trunk/pep-0352.txt (original) +++ peps/trunk/pep-0352.txt Thu Apr 19 21:05:14 2007 @@ -2,8 +2,7 @@ Title: Required Superclass for Exceptions Version: RevisionRevisionRevision Last-Modified: DateDateDate -Author: Brett Cannon <brett at python.org> - Guido van Rossum <guido at python.org> +Author: Brett Cannon, Guido van Rossum Status: Final Type: Standards Track Content-Type: text/x-rst @@ -15,16 +14,14 @@

In Python 2.4 and before, any (classic) class can be raised as an -exception. The plan is to allow new-style classes starting in Python -2.5, but this makes the problem worse -- it would mean any class (or -instance) can be raised! (This is not the case in the final version; -only built-in exceptions can be new-style which means you need to -inherit from a built-in exception to have user-defined exceptions also -be new-style) This is a problem because it -prevents any guarantees from being made about the interface of exceptions. +exception. The plan for 2.5 was to allow new-style classes, but this +makes the problem worse -- it would mean any class (or +instance) can be raised! This is a problem as it prevents any +guarantees from being made about the interface of exceptions. This PEP proposes introducing a new superclass that all raised objects must inherit from. Imposing the restriction will allow a standard -interface for exceptions to exist that can be relied upon. +interface for exceptions to exist that can be relied upon. It also +leads to a known hierarchy for all exceptions to adhere to. One might counter that requiring a specific base class for a particular interface is unPythonic. However, in the specific case of @@ -40,13 +37,13 @@ from Exception. This is a problem since this includes two exceptions (KeyboardInterrupt and SystemExit) that often need to be excepted from the application's exception handling: the default behavior of shutting -the interpreter down with resp. Without a traceback is usually more -desirable than whatever the application might do (with the possible -exception of applications that emulate Python's interactive command -loop with >>> prompt). Changing it so that these two exceptions -inherit from the common superclass instead of Exception will make it -easy for people to write except clauses that are not overreaching -and not catch exceptions that should propagate up. +the interpreter down without a traceback is usually more desirable than +whatever the application might do (with the possible exception of +applications that emulate Python's interactive command loop with +>>> prompt). Changing it so that these two exceptions inherit +from the common superclass instead of Exception will make it easy for +people to write except clauses that are not overreaching and not +catch exceptions that should propagate up. This PEP is based on previous work done for PEP 348 [#pep348]_. @@ -55,8 +52,7 @@

This PEP proposes introducing a new exception named BaseException that -is a new-style class and has a single attribute, message (that -will cause the deprecation of the existing args attribute) Below +is a new-style class and has a single attribute, args. Below is the code as the exception will work in Python 3.0 (how it will work in Python 2.x is covered in the Transition Plan_ section):: @@ -64,46 +60,36 @@ """Superclass representing the base of the exception hierarchy. - Provides a 'message' attribute that contains either the single - argument to the constructor or the empty string. This attribute - is used in the string representation for the - exception. This is so that it provides the extra details in the - traceback.

-The message attribute will contain either the first argument -passed in at instantiation of the object or the empty string if no -arguments were passed in. The attribute is meant to act as a common -location to store any message that is to be passed along -with the exception that goes beyond the location of where the exception -occurred and the exception's type. -No restriction is placed upon what may be passed in for message +No restriction is placed upon what may be passed in for args for backwards-compatibility reasons. In practice, though, only -strings should be used. This keeps the string representation of the -exception to be a useful message about the exception that is -human-readable. Including programmatic information (e.g., an error -code number) should be stored as a separate attribute in a subclass.

-The args attribute is deprecated. While allowing multiple -arguments to be passed can be helpful, it is in no way essential. It -also does not make it clear which argument is going to be represented -by the __str__ method. Restricting initialization to accepting a -single argument keeps the API simple and clear. This also means -providing a __getitem__ method is unneeded for exceptions and thus -will be deprecated as well. +a single string argument should be used. This keeps the string +representation of the exception to be a useful message about the +exception that is human-readable; this is why the __str__ method +special-cases on length-1 args value. Including programmatic +information (e.g., an error code number) should be stored as a +separate attribute in a subclass. The raise statement will be changed to require that any object passed to it must inherit from BaseException. This will make sure @@ -183,37 +169,18 @@ """Superclass representing the base of the exception hierarchy. - Provides a 'message' attribute that contains any single argument - passed in during instantiation. If more than one argument is - passed, it is set to the empty string. It is meant to represent - any message (usually some text) that should be printed out with - the traceback. Unfortunately, for backwards-compatibility, the - 'args' attribute (discussed below) is used for printing out to - tracebacks.

@@ -231,6 +198,16 @@ """ return self.args[index] + def get_message(self): + """Method for 'message' property.""" + warnings.warn("the 'message' attribute has been deprecated " + "since Python 2.6") + return self.args[0] if len(args) == 1 else '' + + message = property(get_message) + + + Deprecation of features in Python 2.9 is optional. This is because it is not known at this time if Python 2.9 (which is slated to be the @@ -242,7 +219,7 @@ when development of that version begins to determine if they are still desired. -* Python 2.5 +* Python 2.5 [done] - all standard exceptions become new-style classes @@ -254,35 +231,56 @@ * Python 2.6 - - deprecate catching string exceptions + - deprecate catching string exceptions [done] + + - deprecate message attribute (see Retracted Ideas)
* Python 2.7 - deprecate raising exceptions that do not inherit from BaseException + - remove message attribute + * Python 2.8 - deprecate catching exceptions that do not inherit from BaseException * Python 2.9
- - deprecate args and __getitem__ (optional) + - deprecate __getitem__ (optional) * Python 3.0 - drop everything that was deprecated above: - + string exceptions (both raising and catching) + + string exceptions (both raising and catching) [done] + + + all exceptions must inherit from BaseException [done] - + all exceptions must inherit from BaseException + + drop __getitem__, message - + drop args and __getitem__ +Retracted Ideas +=============== -Implementation -============== +A previous version of this PEP that was implemented in Python 2.5 +included a 'message' attribute on BaseException. Its purpose was to +begin a transition to BaseException accepting only a single argument. +This was to tighten the interface and to force people to use +attributes in subclasses to carry arbitrary information with an +exception instead of cramming it all into args. + +Unfortunately, while implementing the removal of the args +attribute in Python 3.0 at the PyCon 2007 sprint +[#pycon2007-sprint-email]
, it was discovered that the transition was +very painful, especially for C extension modules. It was decided that +it would be better to deprecate the message attribute in +Python 2.6 (and remove in Python 2.7 and Python 3.0) and consider a +more long-term transition strategy in Python 3.0 to remove +multiple-argument support in BaseException in preference of accepting +only a single argument. Thus the introduction of message and the +original deprecation of args has been retracted. -The initial implementation of this PEP has been checked into Python 2.5 . References

@@ -296,6 +294,9 @@ .. [#SF_1104669] SF patch #1104669 (new-style exceptions) http://www.python.org/sf/1104669 +.. [#pycon2007-sprint-email] python-3000 email ("How far to go with cleaning up exceptions") + http://mail.python.org/pipermail/python-3000/2007-March/005911.html + Copyright



More information about the Python-checkins mailing list