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

Phillip J. Eby pje at telecommunity.com
Sat Jul 30 21:04:05 CEST 2005


At 11:43 PM 7/30/2005 +1000, Nick Coghlan wrote:
>Here's a fairly minimal proposal, which is closer to the existing 2.4 
>structure:
>
>New Hierarchy
>=============
>
>Raisable (formerly Exception)
>+-- CriticalException (new)
>      +-- KeyboardInterrupt
>      +-- MemoryError
>      +-- SystemError
>+-- ControlFlowException (new)
>      +-- GeneratorExit
>      +-- StopIteration
>      +-- SystemExit
>+-- Exception (formerly StandardError)
>      +-- AssertionError
>      +-- AttributeError
>      +-- ImportError
>      +-- TypeError
>      +-- WeakReferenceError (formerly ReferenceError)

I like this a lot, and a good bit of it could actually be done in 2.5, 
apart from the Exception/StandardError move, assuming also that the renamed 
errors were also available under their old names.  We could probably go so 
far as to add Raisable to the hierarchy, but I don't think we could 
actually get quite to your proposed structure without breaking any 
programs.  On the other hand, if we introduce CriticalException and 
ControlFlowException in 2.5 (inheriting from Exception), and create a new 
Error base for StandardError, then promote subclassing and catching it 
instead of Exception, then there will be less to do in 3.0.  So, my 
thoughts for the 2.x series are:


    Exception
       CriticalException
       ControlFlowException
       Error
          StandardError

with the children of these being as you've proposed.  Now, "except Error:" 
would be the replacement for a bare except in most cases, and we would 
recommend subclassing one of the three Exception subclasses instead of 
Exception itself, maybe even introduce a PendingDeprecationWarning for 
direct Exception subclasses outside the exceptions module, with a 
DeprecationWarning in 2.6 and beyond.

Note that subclassing Error instead of Exception won't hurt any programs 
that already catch Exception, and if they have to deal with libraries that 
haven't made the move, they can always use this pattern:

     except (CriticalException,ControlFlowException):
         raise
     except:
         # whatever



More information about the Python-Dev mailing list