[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