2005-08-03 23:18:57 -04:00
|
|
|
|
PEP: 348
|
|
|
|
|
Title: Exception Reorganization for Python 3.0
|
|
|
|
|
Version: $Revision$
|
|
|
|
|
Last-Modified: $Date$
|
|
|
|
|
Author: Brett Cannon <brett@python.org>
|
|
|
|
|
Status: Draft
|
|
|
|
|
Type: Standards Track
|
|
|
|
|
Content-Type: text/x-rst
|
|
|
|
|
Created: 28-Jul-2005
|
|
|
|
|
Post-History: 03-Aug-2005
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Abstract
|
|
|
|
|
========
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Python, as of version 2.4, has 38 exceptions (including warnings) in
|
|
|
|
|
the built-in namespace in a rather shallow hierarchy. This list of
|
|
|
|
|
classes has grown over the years without a chance to learn from
|
|
|
|
|
mistakes and clean up the hierarchy. This PEP proposes doing a
|
|
|
|
|
reorganization for Python 3.0 when backwards-compatibility is not an
|
|
|
|
|
issue. Along with this reorganization, adding a requirement that all
|
|
|
|
|
objects passed to a ``raise`` statement must inherit from a specific
|
|
|
|
|
superclass is proposed. Lastly, bare ``except`` clauses will catch
|
|
|
|
|
only exceptions inheriting from Exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rationale
|
|
|
|
|
=========
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Exceptions are a critical part of Python. While exceptions are
|
|
|
|
|
traditionally used to signal errors in a program, they have also grown
|
|
|
|
|
to be used for flow control for things such as iterators. Their
|
|
|
|
|
importance is great.
|
|
|
|
|
|
|
|
|
|
But the organization of the exception hierarchy is suboptimal to serve
|
|
|
|
|
the multiple uses of exceptions. Mostly for backwards-compatibility
|
|
|
|
|
reasons, the hierarchy has stayed very flat and old exceptions whose
|
|
|
|
|
usefulness has not been proven have been left in. Making exceptions
|
|
|
|
|
more hierarchical would help facilitate exception handling by making
|
|
|
|
|
exception catching using inheritance much more logical. This should
|
|
|
|
|
also help lead to fewer errors from overly broad exception catching in
|
|
|
|
|
``except`` clauses.
|
|
|
|
|
|
|
|
|
|
A mandatory superclass for all exceptions is also being proposed
|
|
|
|
|
[#Summary2004-08-01]_. By requiring any object that is used in a
|
|
|
|
|
``raise`` statement to inherit from a specific superclass, certain
|
|
|
|
|
attributes (such as those laid out in PEP 344 [#PEP344]_) can be
|
|
|
|
|
guaranteed to exist. This also will lead to the planned removal of
|
|
|
|
|
string exceptions.
|
|
|
|
|
|
|
|
|
|
Lastly, bare ``except`` clauses are to catch only exceptions that
|
|
|
|
|
inherit from ``Exception`` [#python-dev3]_. While currently used to
|
|
|
|
|
catch all exceptions, that use is too far-reaching and typically not
|
|
|
|
|
desired. Catching only exceptions that inherit from ``Exception``
|
|
|
|
|
allows other exceptions (those that should not be caught unless
|
|
|
|
|
explicitly desired) to continue to propagate up the execution stack.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Philosophy of Reorganization
|
|
|
|
|
============================
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
There are several goals in this reorganization that defined the
|
|
|
|
|
philosophy used to guide the work. One goal was to prune out unneeded
|
|
|
|
|
exceptions. Extraneous exceptions should not be left in since they
|
|
|
|
|
just serve to clutter the built-in namespace. Unneeded exceptions
|
|
|
|
|
also dilute the importance of other exceptions by splitting uses
|
|
|
|
|
between several exceptions when all uses should have been under a
|
|
|
|
|
single exception.
|
|
|
|
|
|
|
|
|
|
Another goal was to introduce exceptions that were deemed necessary to
|
|
|
|
|
fill holes in the hierarchy. Most new exceptions were added to flesh
|
|
|
|
|
out the inheritance hierarchy to make it easier to catch a category of
|
|
|
|
|
exceptions with a simpler ``except`` clause.
|
|
|
|
|
|
|
|
|
|
Changing inheritance to make the hierarchy more reasonable was a goal.
|
|
|
|
|
As stated above, having proper inheritance allows for more accurate
|
|
|
|
|
``except`` statements when catching exceptions based on the
|
|
|
|
|
inheritance tree.
|
|
|
|
|
|
|
|
|
|
Lastly, some renaming was done to make the usage of certain exceptions
|
|
|
|
|
more obvious. Having to look up an exception due to the name not
|
|
|
|
|
accurately reflecting its intended use is annoying and slows down
|
|
|
|
|
debugging. Having accurate names also makes debugging easier for new
|
|
|
|
|
programmers. But for simplicity, for the convenience of existing
|
|
|
|
|
users, and for the sake of transitioning to Python 3.0, only
|
|
|
|
|
exceptions whose names were significantly out of alignment with their
|
|
|
|
|
stated purpose have been renamed. All exceptions dealing with errors
|
|
|
|
|
will be named with an "Error" suffix.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
New Hierarchy
|
|
|
|
|
=============
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. Note:: Exceptions flagged with "stricter inheritance" will no
|
|
|
|
|
longer inherit from a certain class. A "broader inheritance" flag
|
|
|
|
|
means a class has been added to the exception's inheritance tree.
|
|
|
|
|
|
|
|
|
|
.. parsed-literal::
|
|
|
|
|
|
|
|
|
|
BaseException
|
|
|
|
|
+-- CriticalError (new)
|
|
|
|
|
+-- KeyboardInterrupt (stricter inheritance)
|
|
|
|
|
+-- MemoryError (stricter inheritance)
|
|
|
|
|
+-- SystemError (stricter inheritance)
|
|
|
|
|
+-- ControlFlowException (new)
|
|
|
|
|
+-- GeneratorExit (defined in PEP 342 [#PEP342]_)
|
|
|
|
|
+-- StopIteration (stricter inheritance)
|
|
|
|
|
+-- SystemExit (stricter inheritance)
|
|
|
|
|
+-- Exception
|
|
|
|
|
+-- StandardError
|
|
|
|
|
+-- ArithmeticError
|
|
|
|
|
+-- DivideByZeroError
|
|
|
|
|
+-- FloatingPointError
|
|
|
|
|
+-- OverflowError
|
|
|
|
|
+-- AssertionError
|
|
|
|
|
+-- AttributeError
|
|
|
|
|
+-- EnvironmentError
|
|
|
|
|
+-- IOError
|
|
|
|
|
+-- EOFError (broader inheritance)
|
|
|
|
|
+-- OSError
|
|
|
|
|
+-- ImportError
|
|
|
|
|
+-- LookupError
|
|
|
|
|
+-- IndexError
|
|
|
|
|
+-- KeyError
|
|
|
|
|
+-- NamespaceError (renamed from NameError)
|
|
|
|
|
+-- UnboundFreeError (new)
|
|
|
|
|
+-- UnboundGlobalError (new)
|
|
|
|
|
+-- UnboundLocalError
|
|
|
|
|
+-- NotImplementedError (stricter inheritance)
|
|
|
|
|
+-- SyntaxError
|
|
|
|
|
+-- IndentationError
|
|
|
|
|
+-- TabError
|
|
|
|
|
+-- TypeError
|
|
|
|
|
+-- UserError (renamed from RuntimeError)
|
|
|
|
|
+-- UnicodeError
|
|
|
|
|
+-- UnicodeDecodeError
|
|
|
|
|
+-- UnicodeEncodeError
|
|
|
|
|
+-- UnicodeTranslateError
|
|
|
|
|
+-- ValueError
|
|
|
|
|
+-- Warning
|
|
|
|
|
+-- AnyDeprecationWarning (new; broader inheritance for subclasses)
|
|
|
|
|
+-- PendingDeprecationWarning
|
|
|
|
|
+-- DeprecationWarning
|
|
|
|
|
+-- FutureWarning
|
|
|
|
|
+-- SyntaxWarning
|
|
|
|
|
+-- SemanticsWarning (renamed from RuntimeWarning)
|
|
|
|
|
+-- UserWarning
|
|
|
|
|
+-- WeakReferenceError (renamed from ReferenceError)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Differences Compared to Python 2.4
|
|
|
|
|
==================================
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Changes to exceptions from Python 2.4 can take shape in three forms:
|
|
|
|
|
removal, renaming, or change of position in the hierarchy. There are
|
|
|
|
|
also new exceptions introduced in the proposed hierarchy.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
In terms of new exceptions, almost all are added to flesh out the
|
|
|
|
|
inheritance tree. Those that are leaf classes are added to alleviate
|
|
|
|
|
the overloading of another exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Positional changes result in either broader or more restrictive
|
|
|
|
|
inheritance. The broader inheritance typically occurred to allow for
|
|
|
|
|
a more reasonable superclass to group related exceptions together.
|
|
|
|
|
Stricter inheritance happened when the pre-existing inheritance was
|
|
|
|
|
deemed incorrect and needed correction.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
New Exceptions
|
|
|
|
|
--------------
|
|
|
|
|
|
2005-08-03 23:33:03 -04:00
|
|
|
|
BaseException
|
|
|
|
|
'''''''''''''
|
|
|
|
|
|
|
|
|
|
The superclass that all exceptions must inherit from.
|
|
|
|
|
|
|
|
|
|
|
2005-08-03 23:18:57 -04:00
|
|
|
|
CriticalError
|
|
|
|
|
'''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
The superclass for severe error exceptions; typically, one would not
|
|
|
|
|
want to recover from such an exception. The name is meant to reflect
|
|
|
|
|
that these exceptions are raised asynchronously by the interpreter
|
|
|
|
|
when a critical event has occured.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ControlFlowException
|
|
|
|
|
''''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
This exception exists as a superclass for all exceptions that directly
|
|
|
|
|
deal with control flow. Inheriting from BaseException instead of
|
|
|
|
|
Exception prevents them from being caught accidently when one wants to
|
|
|
|
|
catch errors. The name, by not mentioning "Error", does not lead to
|
|
|
|
|
one to confuse the subclasses as errors.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UnboundGlobalError
|
|
|
|
|
''''''''''''''''''
|
|
|
|
|
|
|
|
|
|
Raised when a global variable was not found.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
UnboundFreeError
|
|
|
|
|
''''''''''''''''
|
|
|
|
|
|
|
|
|
|
Raised when a free variable is not found.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AnyDeprecationWarning
|
|
|
|
|
'''''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
A common superclass for all deprecation-related exceptions. While
|
|
|
|
|
having DeprecationWarning inherit from PendingDeprecationWarning was
|
|
|
|
|
suggested (a DeprecationWarning can be viewed as a
|
|
|
|
|
PendingDeprecationWarning that is happening now), the logic was not
|
|
|
|
|
agreed upon by a majority. But since the exceptions are related,
|
|
|
|
|
creating a common superclass is warranted.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removed Exceptions
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
WindowsError
|
|
|
|
|
''''''''''''
|
|
|
|
|
|
|
|
|
|
Too OS-specific to be kept in the built-in exception hierarchy.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Renamed Exceptions
|
|
|
|
|
------------------
|
|
|
|
|
|
|
|
|
|
RuntimeError
|
|
|
|
|
''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Renamed to UserError.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Meant as a generic exception for use when neither a new exception
|
|
|
|
|
class nor inheritance-based exception catching is desired,
|
|
|
|
|
RuntimeError is poorly named. Its name in Python 2.4 seems to suggest
|
|
|
|
|
an error that occurred at runtime, possibly an error in the VM.
|
|
|
|
|
Renaming the exception to UserError more clearly states the purpose of
|
|
|
|
|
the exception as a quick-and-dirty error exception. The name also
|
|
|
|
|
keeps it in line with UserWarning.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
If a user wants an non-error exception, raising BaseException directly
|
|
|
|
|
should be sufficient since Exception, which UserError inherits from,
|
|
|
|
|
is only used for errors.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ReferenceError
|
|
|
|
|
''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Renamed to WeakReferenceError.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
ReferenceError was added to the built-in exception hierarchy in Python
|
|
|
|
|
2.2 [#exceptions-stdlib]_. Its name comes directly from the time when
|
|
|
|
|
it resided in the ``weakref`` module. Unfortunately its name does not
|
|
|
|
|
suggest its connection to weak references and thus deserves a
|
|
|
|
|
renaming.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NameError
|
|
|
|
|
'''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Renamed to NamespaceError.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
While NameError suggests its common use, it is not entirely apparent.
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Making it a superclass for namespace-related exceptions warrants a
|
|
|
|
|
renaming to make its use abundantly clear. Plus the documentation of
|
|
|
|
|
the exception module [#exceptions-stdlib]_ states that it was actually
|
|
|
|
|
meant for global names and not for just any exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RuntimeWarning
|
|
|
|
|
''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Renamed to SemanticsWarning.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
RuntimeWarning is supposed to represent semantic changes coming in the
|
|
|
|
|
future. But while saying that it affects the "runtime" is true,
|
|
|
|
|
flat-out stating that it is a semantic change is much clearer,
|
|
|
|
|
eliminating any possible association of the term "runtime" with the
|
|
|
|
|
virtual machine.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Change of Position in the Exception Hierarchy
|
|
|
|
|
---------------------------------------------
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
KeyboardInterrupt, MemoryError, and SystemError
|
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Inherit from CriticalError instead of from Exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
These three exceptions are not standard errors by any means. They are
|
|
|
|
|
raised asynchronously by the interpreter when something specific has
|
2005-08-03 23:33:03 -04:00
|
|
|
|
occurred. Thus they warrant not inheriting from Exception but from an
|
2005-08-05 01:31:44 -04:00
|
|
|
|
entirely separate exception that will not be caught by a bare
|
|
|
|
|
``except`` clause.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-03 23:41:38 -04:00
|
|
|
|
StopIteration and SystemExit
|
|
|
|
|
''''''''''''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Inherit from ControlFlowException instead of from Exception.
|
2005-08-03 23:41:38 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
By having these exceptions no longer inherit from Exception they will
|
|
|
|
|
not be accidentally caught by a bare ``except`` clause.
|
2005-08-03 23:41:38 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-03 23:18:57 -04:00
|
|
|
|
NotImplementedError
|
|
|
|
|
'''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Inherits from Exception instead of from RuntimeError (renamed to
|
|
|
|
|
UserError).
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Originally inheriting from RuntimeError, NotImplementedError does not
|
|
|
|
|
have any direct relation to the exception meant for use in user code
|
|
|
|
|
as a quick-and-dirty exception. Thus it now directly inherits from
|
|
|
|
|
Exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EOFError
|
|
|
|
|
''''''''
|
|
|
|
|
|
|
|
|
|
Subclasses IOError.
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Since an EOF comes from I/O it only makes sense that it be considered
|
|
|
|
|
an I/O error.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Required Superclass for ``raise``
|
|
|
|
|
=================================
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
By requiring all objects passed to a ``raise`` statement to inherit
|
|
|
|
|
from a specific superclass, all exceptions are guaranteed to have
|
|
|
|
|
certain attributes. If PEP 344 [#PEP344]_ is accepted, the attributes
|
|
|
|
|
outlined there will be guaranteed to be on all exceptions raised.
|
|
|
|
|
This should help facilitate debugging by making the querying of
|
|
|
|
|
information from exceptions much easier.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
The proposed hierarchy has BaseException as the required base class.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implementation
|
|
|
|
|
--------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Enforcement is straightforward. Modifying ``RAISE_VARARGS`` to do an
|
|
|
|
|
inheritance check first before raising an exception should be enough.
|
|
|
|
|
For the C API, all functions that set an exception will have the same
|
|
|
|
|
inheritance check applied.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Bare ``except`` Clauses Catching ``Exception`` Only
|
|
|
|
|
===================================================
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
While Python does have its "explicit is better than implicit" tenant,
|
|
|
|
|
it is not necessary if there is a reasonable default behavior.
|
|
|
|
|
Changing the behavior of a bare ``except`` clause makes its existance
|
|
|
|
|
quite reasonable.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
In Python 2.4, a bare ``except`` clause will catch any and all
|
|
|
|
|
exceptions. Typically, though, this is not what is truly desired.
|
|
|
|
|
More often than not one wants to catch all error exceptions that do
|
|
|
|
|
not signify a "bad" interpreter state. In the new exception hierarchy
|
|
|
|
|
this is condition is embodied by Exception. Thus bare ``except``
|
|
|
|
|
clauses will catch only exceptions inheriting from Exception.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Implementation
|
|
|
|
|
--------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
In the compiler, when a bare ``except`` clause is reached, the code
|
|
|
|
|
for ``except Exception`` will be emitted.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Transition Plan
|
|
|
|
|
===============
|
|
|
|
|
|
|
|
|
|
Exception Hierarchy Changes
|
|
|
|
|
---------------------------
|
|
|
|
|
|
|
|
|
|
New Exceptions
|
|
|
|
|
''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
New exceptions can simply be added to the built-in namespace. Any
|
|
|
|
|
pre-existing objects with the same name will mask the new exceptions,
|
2005-08-03 23:18:57 -04:00
|
|
|
|
preserving backwards-compatibility.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Renamed Exceptions
|
|
|
|
|
''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Renamed exceptions will directly subclass the new names. When the old
|
|
|
|
|
exceptions are instantiated (which occurs when an exception is caught,
|
|
|
|
|
either by a ``try`` statement or by propagating to the top of the
|
2005-08-03 23:18:57 -04:00
|
|
|
|
execution stack), a PendingDeprecationWarning will be raised.
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
This should properly preserve backwards-compatibility as old usage
|
|
|
|
|
won't change and the new names can also be used to catch exceptions
|
|
|
|
|
using the old names. The warning of the deprecation is also kept
|
|
|
|
|
simple.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
New Inheritance for Old Exceptions
|
|
|
|
|
''''''''''''''''''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Using multiple inheritance to our advantage, exceptions whose
|
|
|
|
|
inheritance is now more resrictive can be made backwards-compatible.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
By inheriting from both the new superclasses as well as the original
|
2005-08-05 01:31:44 -04:00
|
|
|
|
superclasses, existing ``except`` clauses will continue to work as
|
|
|
|
|
before while allowing the new inheritance to be used for new code.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
A PendingDeprecationWarning will be raised based on whether the
|
|
|
|
|
bytecode ``COMPARE_OP(10)`` results in an exception being caught that
|
|
|
|
|
would not have under the new hierarchy. This will require hard-coding
|
|
|
|
|
in the implementation of the bytecode.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removed Exceptions
|
|
|
|
|
''''''''''''''''''
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Exceptions scheduled for removal will be transitioned much like the
|
|
|
|
|
old names of renamed exceptions. Upon instantiation a
|
|
|
|
|
PendingDeprecationWarning will be raised stating the the exception is
|
|
|
|
|
due for removal in Python 3.0.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Required Superclass for ``raise``
|
|
|
|
|
---------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
A SemanticsWarning will be raised when an object is passed to
|
|
|
|
|
``raise`` that does not have the proper inheritance.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removal of Bare ``except`` Clauses
|
|
|
|
|
----------------------------------
|
|
|
|
|
|
|
|
|
|
A SemanticsWarning will be raised for all bare ``except`` clauses.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rejected Ideas
|
|
|
|
|
==============
|
|
|
|
|
|
|
|
|
|
Threads on python-dev discussing this PEP can be found at
|
2005-08-05 01:31:44 -04:00
|
|
|
|
[#python-dev-thread1]_ and [#python-dev-thread2]_
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KeyboardInterrupt inheriting from ControlFlowException
|
|
|
|
|
------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
KeyboardInterrupt has been a contentious point within this hierarchy.
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Some view the exception more as control flow being caused by the user.
|
|
|
|
|
But with its asynchronous cause (the user is able to trigger the
|
|
|
|
|
exception at any point in code) its proper place is inheriting from
|
|
|
|
|
CriticalException. It also keeps the name of the exception from being
|
|
|
|
|
"CriticalError".
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-03 23:33:03 -04:00
|
|
|
|
Other Names for BaseException and Exception
|
|
|
|
|
-------------------------------------------
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Alternative names for BaseException and Exception have been
|
|
|
|
|
Raisable/Exception and Exception/StandardError. The former
|
|
|
|
|
alternatives were rejected because "Raisable" does not reflect its
|
|
|
|
|
exception nature well enough. The latter alternatives were rejected
|
|
|
|
|
because they do not reflect current use.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DeprecationWarning Inheriting From PendingDeprecationWarning
|
|
|
|
|
------------------------------------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
This was originally proposed because a DeprecationWarning can be
|
|
|
|
|
viewed as a PendingDeprecationWarning that is being removed in the
|
|
|
|
|
next version. But since enough people thought the inheritance could
|
|
|
|
|
logically work the other way around, the idea was dropped.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AttributeError Inheriting From TypeError or NameError
|
|
|
|
|
-----------------------------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Viewing attributes as part of the interface of a type caused the idea
|
|
|
|
|
of inheriting from TypeError. But that partially defeats the thinking
|
|
|
|
|
of duck typing and thus the idea was dropped.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Inheriting from NameError was suggested because objects can be viewed
|
|
|
|
|
as having their own namespace where the attributes live and when an
|
|
|
|
|
attribute is not found it is a namespace failure. This was also
|
|
|
|
|
dropped as a possibility since not everyone shared this view.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removal of EnvironmentError
|
|
|
|
|
---------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Originally proposed based on the idea that EnvironmentError was an
|
|
|
|
|
unneeded distinction, the BDFL overruled this idea [#python-dev4]_.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduction of MacError and UnixError
|
|
|
|
|
--------------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Proposed to add symmetry to WindowsError, the BDFL said they won't be
|
|
|
|
|
used enough [#python-dev4]_. The idea of then removing WindowsError
|
|
|
|
|
was proposed and accepted as reasonable, thus completely negating the
|
|
|
|
|
idea of adding these exceptions.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SystemError Subclassing SystemExit
|
|
|
|
|
----------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Proposed because a SystemError is meant to lead to a system exit, the
|
|
|
|
|
idea was removed since CriticalException indicates this better.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
2005-08-03 23:33:03 -04:00
|
|
|
|
ControlFlowException Under Exception
|
|
|
|
|
------------------------------------
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
It has been suggested that ControlFlowException should inherit from
|
|
|
|
|
Exception. This idea has been rejected based on the thinking that
|
|
|
|
|
control flow exceptions typically should not be caught by bare
|
|
|
|
|
``except`` clauses, whereas Exception subclasses should be.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Removal of Bare ``except`` Clauses
|
|
|
|
|
----------------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
The suggestion has been made to remove bare ``except`` clauses
|
|
|
|
|
altogether, in the name of "explicit is better than implicit". But
|
|
|
|
|
Guido has said this is too weak of an argument since other areas of
|
|
|
|
|
Python have default behavior [#python-dev3]_.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Open Issues
|
|
|
|
|
===========
|
|
|
|
|
|
|
|
|
|
Remove ControlFlowException?
|
|
|
|
|
----------------------------
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
It has been suggested that ControlFlowException is not needed. Since
|
|
|
|
|
the desire to catch any control flow exception will be atypical, the
|
2005-08-03 23:18:57 -04:00
|
|
|
|
suggestion is to just remove the exception and let the exceptions that
|
2005-08-05 01:31:44 -04:00
|
|
|
|
inherited from it inherit directly from BaseException. This still
|
|
|
|
|
preserves the seperation from Exception which is one of the driving
|
|
|
|
|
factors behind the introduction of ControlFlowException.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Acknowledgements
|
|
|
|
|
================
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
Thanks to Robert Brewer, Josiah Carlson, Nick Coghlan, Timothy
|
|
|
|
|
Delaney, Jack Diedrich, Fred L. Drake, Jr., Philip J. Eby, Greg Ewing,
|
|
|
|
|
James Y. Knight, MA Lemburg, Guido van Rossum, Stephen J. Turnbull and
|
|
|
|
|
everyone else I missed for participating in the discussion.
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
References
|
|
|
|
|
==========
|
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#PEP342] PEP 342 (Coroutines via Enhanced Generators)
|
|
|
|
|
(http://www.python.org/peps/pep-0342.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#PEP344] PEP 344 (Exception Chaining and Embedded Tracebacks)
|
|
|
|
|
(http://www.python.org/peps/pep-0344.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#Summary2004-08-01] python-dev Summary (An exception is an
|
|
|
|
|
exception, unless it doesn't inherit from Exception)
|
|
|
|
|
(http://www.python.org/dev/summary/2004-08-01_2004-08-15.html#an-exception-is-an-exception-unless-it-doesn-t-inherit-from-exception)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#Summary2004-09-01] python-dev Summary (Cleaning the Exception House)
|
|
|
|
|
(http://www.python.org/dev/summary/2004-09-01_2004-09-15.html#cleaning-the-exception-house)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev1] python-dev email (Exception hierarchy)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2004-August/047908.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev2] python-dev email (Dangerous exceptions)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2004-September/048681.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev3] python-dev email (PEP, take 2: Exception
|
|
|
|
|
Reorganization for Python 3.0)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2005-August/055116.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#exceptions-stdlib] exceptions module
|
|
|
|
|
(http://docs.python.org/lib/module-exceptions.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev-thread1] python-dev thread (Pre-PEP: Exception
|
|
|
|
|
Reorganization for Python 3.0)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2005-July/055020.html,
|
|
|
|
|
http://mail.python.org/pipermail/python-dev/2005-August/055065.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev-thread2] python-dev thread (PEP, take 2: Exception
|
|
|
|
|
Reorganization for Python 3.0)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2005-August/055103.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
2005-08-05 01:31:44 -04:00
|
|
|
|
.. [#python-dev4] python-dev email (Pre-PEP: Exception Reorganization
|
|
|
|
|
for Python 3.0)
|
|
|
|
|
(http://mail.python.org/pipermail/python-dev/2005-July/055019.html)
|
2005-08-03 23:18:57 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright
|
|
|
|
|
=========
|
|
|
|
|
|
|
|
|
|
This document has been placed in the public domain.
|
2005-08-05 01:31:44 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
..
|
|
|
|
|
Local Variables:
|
|
|
|
|
mode: indented-text
|
|
|
|
|
indent-tabs-mode: nil
|
|
|
|
|
sentence-end-double-space: t
|
|
|
|
|
fill-column: 70
|
|
|
|
|
End:
|