[Python-Dev] Pre-PEP: Exception Reorganization for Python 3.0

Guido van Rossum gvanrossum at gmail.com
Sat Jul 30 04:41:37 CEST 2005


On 7/29/05, Brett Cannon <bcannon at gmail.com> wrote:
> Well, it has been discussed at multiple times in the past and I have
> promised to write this PEP several times, so I finally found enough
> time to write a PEP on reorganizing exceptions for Python 3.0 .

Thanks for getting this ball rolling!

(I wonder what happened to Ping's PEP 344 -- he just dropped out, it
seems.)

Below is some feedback.

> Often people use a bare ``except`` when what they really wanted were
> non-critical exceptions to be caught while more system-specific ones,
> such as MemoryError, to pass through and to halt the interpreter.
> With a hierarchy reorganization, bare ``except`` clauses can be
> changed to only catch exceptions that subclass a non-critical
> exception superclass, allowing more critical exceptions to propagate
> to the top of the execution stack as was most likely intended.

I appreciate the attempt to make bare except: less dangerous by not
catching certain exceptions, but I worry that these changes might
actually make bare except: *more* likely to be used, which is contrary
to the intention.  Maybe we should just get rid of it, and encourage
people to write

    except Exception:

or

    except Raisable:

depending on what they want.

> MacError
> UnixError

Do we really need these?  Let's not add things that won't be used.

> NamespaceException
> 
> To provide a common superclass for exceptions dealing with namespace
> issues, this exception is introduced.
> Both UnboundLocalError and UnboundGlobalError (the new name for
> NameError) inherit from this class.

OTOH there's something to say to unify NameError and AttributeError,
isn't there?
> EnvironmentError
> 
> Originally meant as an exception for when an event outside of the
> interpreter needed to raise an exception, its use has been deemed
> unneeded.
> While both IOError and OSError inherited this class, the distinction
> between OS and I/O is significant enough to not warrant having a
> common subclass that one might base an ``except`` clause on.

-1000.  Depending on whether you use open() or os.open() you'll get
one or the other for pretty much the same thing.

Also, I think that socket.error and select.error should inherit from
EnvironmentError (or maybe even from OSError).

> RuntimeError

> Meant to be used when an existing exception does not fit, its
> usefulness is consider meager in Python 2.4 [exceptionsmodule]_.
> Also, with the CriticalException/Exception dichotomy, Exception or
> CriticalException can be raised directly for the same use.

-0.5.  I use it all the time as the "application" exception in apps
(scripts) that are too small to define their own exception hierarchy.

> StopIteration and GeneratorExit
> 
> Inherit from ControlFlowException.
> 
> Collecting all control flow-related exceptions under a common
> superclass continues with the theme of maintaining a hierarchy.

Yes, but how useful it this?  I don't expect to ever come across a
situation where I'd want to catch both, so this is more for
organization of the docs than for anything else.

IMO a good principle for determining the ideal exception hierarchy is
whether there's a use case for catching the common base class.

> IOError
> 
> No longer subclasses EnvironmentError.

-1000, see above.

> Change the Name of Raisable?
> 
> It has been argued that Raisable is a bad name to use since it is not
> an actual word [python-dev1]_.

Then we'll make it a word.  Is Java's equivalent, Throwable, any more
a word?  In this case I like the parallel with Java.

> Should Bare ``except`` Clauses be Removed?

Yes, see above.

-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list