[Python-Dev] PEP, take 2: Exception Reorganization for Python 3.0

Nick Coghlan ncoghlan at gmail.com
Wed Aug 3 15:10:33 CEST 2005

Phillip J. Eby wrote:
> +1.  The main things that need fixing, IMO, are the need for critical and 
> control flow exceptions to be distinguished from "normal" errors.  The rest 
> is mostly too abstract for me to care about in 2.x.

I guess, before we figure out "where would we like to go?", we really need to 
know "what's wrong with where we are right now?"

Like you, the only real problem I have with the current hierarchy is that 
"except Exception:" is just as bad as a bare except in terms of catching 
exceptions it shouldn't (like SystemExit). I find everything else about the 
hierarchy is pretty workable (mainly because it *is* fairly flat - if I want 
to catch a couple of different exception types, which is fairly rare, I can 
just list them).

I like James's suggestion that instead of trying to switch people to using 
something other than "except Exception:", we just aim to adjust the hierarchy 
so that "except Exception" becomes the right thing to do. Changing the 
inheritance structure a bit is far easier than trying to shift several years 
of accumulated user experience. . .

Anyway, with the hierarchy below, "except Exception:" still overreaches, but 
can be corrected by preceding it with "except (ControlFlow, CriticalError): 

"except Exception:" stops overreaching once the links from Exception to 
StopIteration and SystemExit, and the links from StandardError to 
KeyboardInterrupt, SystemError and MemoryError are removed (probably difficult 
to do before Py3k but not impossible).

This hierarchy also means that inheriting application and library errors from 
Exception can continue to be recommended practice. Adapting the language to 
fit the users rather than the other way around seems to be a pretty good call 
on this point. . .

The only changes from the Python 2.4 hierarchy are:
    New exceptions:
      - Raisable (new base)
      - ControlFlow (inherits from Raisable)
      - CriticalError (inherits from Raisable)
      - GeneratorExit (inherits from ControlFlow)
    Added inheritance:
      - Exception from Raisable
      - StopIteration, SystemExit, KeyboardInterrupt from ControlFlow
      - SystemError, MemoryError from CriticalError

Python 2.4 Compatible Improved Exception Hierarchy v 0.2 [1]

   Raisable (new)
   +-- ControlFlow (new)
       +-- GeneratorExit (new)
       +-- StopIteration (inheritance new)
       +-- SystemExit (inheritance new)
       +-- KeyboardInterrupt (inheritance new)
   +-- CriticalError (new)
       +-- MemoryError (inheritance new)
       +-- SystemError (inheritance new)
   +-- Exception (inheritance new)
       +-- StopIteration
       +-- SystemExit
       +-- StandardError
           +-- KeyboardInterrupt
           +-- MemoryError
           +-- SystemError
           +-- AssertionError
           +-- AttributeError
           +-- EOFError
           +-- ImportError
           +-- TypeError
           +-- ReferenceError
           +-- ArithmeticError
               +-- FloatingPointError
               +-- DivideByZeroError
               +-- OverflowError
           +-- EnvironmentError
               +-- OSError
                   +-- WindowsError
               +-- IOError
           +-- LookupError
               +-- IndexError
               +-- KeyError
           +-- NameError
               +-- UnboundLocalError
           +-- RuntimeError
               +-- NotImplementedError
           +-- SyntaxError
               +-- IndentationError
                   +-- TabError
           +-- ValueError
               +-- UnicodeError
                   +-- UnicodeDecodeError
                   +-- UnicodeEncodeError
                   +-- UnicodeTranslateError
       +-- Warning
           +-- DeprecationWarning
           +-- FutureWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning


[1] I've started putting version numbers on these suggestions, since someone 
referred to "Nick's exception hierarchy" in one of the threads, and I had no 
idea which of my suggestions they meant. I think I'm up to three or four 
different variants by now. . .

Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia

More information about the Python-Dev mailing list