[Python-Dev] Exception hierarchy [was Re: Another test_compiler mystery]

Bob Ippolito bob at redivi.com
Tue Aug 17 02:33:51 CEST 2004


On Aug 16, 2004, at 8:07 PM, James Y Knight wrote:

> On Aug 16, 2004, at 7:29 AM, Armin Rigo wrote:
>> Yes.  Here is a patch attempting to do what I described:
>>  http://www.python.org/sf/1009929
>
>
> From the patch description:
>>  Some more thinking about [the exception hierarchy] would be welcome. 
>> Maybe AsynchronousException and a few others should not subclass 
>> Exception at all, so that "except Exception" statements don't catch 
>> them. Anyway, this patch alreaddy improves the situation, because you 
>> can catch and re-raise AsynchronousException (instead of, say, just 
>> KeyboardInterrupt).
>
> It seems to me that something similar to what Java has would be a good 
> idea. Namely, a new top level exception (from which all others would 
> derive) called "Raisable", analogous to Java's Throwable. This then 
> has two subclasses: "Exception", and "FatalError". I'm not sure 
> FatalError is a good name, but *some* new name needs to be thought up 
> for Java's "Error" class, because lots of python exceptions end in 
> "Error" but belong under the "Exception" hierarchy (for example 
> "KeyError").
>
> The criteria for whether a given exception should go under "Exception" 
> or "FatalError" is whether users' code should generally catch the 
> exception. Thus, at least "SystemExit", "KeyboardInterrupt", and 
> "MemoryError" should go under "FatalError". Catching those is nearly 
> never what you wanted to do when you write "except Exception:". 
> There's likely more -- I have not gone through all the exceptions in 
> Python to classify them.
>
> One issue is that creating a new category of Exceptions doesn't help 
> people who do "except:" instead of "except Exception:". It is unlikely 
> that person meant to catch things like MemoryError, rather, they were 
> just being lazy. I suppose that syntax could be deprecated, at least 
> in example code and documentation, in favor of "except Exception" for 
> the usual case, and "except Raisable" for the cases where you do 
> actually want to catch everything*.
>
> James
>
> * Except, of course, old string exceptions which have been deprecated 
> for ages.

* basestr could inherit from "Raisable" ;)

The big problem with "Raisable" is that both raiseable and raisable 
seem to be correct spellings, and I don't think either are in many 
abridged dictionaries (the OS X spell checker doesn't like either, for 
example).

-bob


More information about the Python-Dev mailing list