
So maybe the plan should look somethink like this:
1. Deprecate string exceptions.
2. Make Exception a new-style class.
3. Require exceptions to be derived from Exception.
4. Make the traceback an attribute of the exception object.
5. Implement exception chaining (as an attribute named cause on the outer exception referencing the inner exception).
6. Add other exception attributes (e.g. KeyError has an attribute key, IndexError has an attribute index, IOError has attributes filename, errorcode etc.)
I think (1) and (3) aren't absolutely necessary -- strings and classic classes would simply not have the traceback attribute. For backwards compatibility it could still be kept separate in (the per-thread equivalent of) sys.exc_traceback, but at some point, that would be phased out and traceback reporting for deprecated exception types would be reduced -- a nice incentive for moving to new-style exceptions! (Or, for classic classes, it wouldn't be okay to store the traceback on a system attribute, e.g. __traceback__.) --Guido van Rossum (home page: http://www.python.org/~guido/)