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): raise". "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 Cheers, Nick. [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 | [EMAIL PROTECTED] | Brisbane, Australia --------------------------------------------------------------- http://boredomandlaziness.blogspot.com _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com