[Python-Dev] Pre-PEP: Exception Reorganization for Python 3.0

Brett Cannon bcannon at gmail.com
Sun Jul 31 04:15:24 CEST 2005


On 7/30/05, Nick Coghlan <ncoghlan at gmail.com> wrote:
> Brett Cannon wrote:
> > Nick, are you going go start subbing in for Tim when he is busy and
> > take my work that I spent hours on, come up with an alternative that
> > took 10 minutes, and have everyone end up loving your newfangled idea
> > 10x more than my original?  =)
> 
> It's like editing creative writing - I find it far, far easier to take
> something good and tweak it to make it better, than to come up with something
> good in the first place ;)
>

You stand on the shoulder of a giant (and I am only partially kidding;
people who have met me will get the joke)!
 
> >>+-- Exception (formerly StandardError)
> >>     +-- AssertionError
> >>     +-- AttributeError
> >
> >
> > I am still up for moving AttributeError, but with the amount of
> > arguing going on between where it should go I am not going to be
> > shocked if we go with the status quo.
> 
> Exactly my thought. I had it under "NameError" for a while, but had difficulty
> coming up with a case where lumping it in with the lexical scoping errors was
> actually beneficial.
> 
> Eventually, the fact that it is easy to add another exception to an except
> clause, but hard to remove a child you don't want that inherits from a parent
> you do want persauded me to leave this one alone.
> 

I think this one will require BDFL pronouncement to be moved since
this already looks like a contested idea.  And I don't think Guido is
going to care enough to want to see it moved.

> >>     +-- EnvironmentError
> >>         +-- OSError
> >>             +-- WindowsError (possibly remove this from builtins)
> >
> >
> > If we are going to lack exceptions for other OSs, I say remove it.  No
> > reason Windows should get special treatment with a built-in exception.
> 
> True. And the interface looks the same as the normal OSError interface, so it
> should be possible to replace all uses with a basic OSError.
> 

Glad you agree.  =)

> >>     +-- NameError
> >>         +-- UnboundLocalError
> >
> >
> > What about UnboundGlobalError?
> 
> I realised this was a misnomer. A failed name lookup actually means:
>    - the name was not in locals
>    - the name was not in any lexically containing scope
>    - the name was not in the module globals
>    - the name was not in builtins
> 
> The program doesn't know which of those namespaces was *meant* to contain the
> name - it only knows that none of them actually contained it. This criticism
> also applies to the current wording of the NameError text used in this
> situation (which implies the name should have been in the module globals).
> 
> Now, a case could possibly be made for separate errors for cases like the
> following:
> 
>    def f():
>      global x
>      print x # UnboundGlobalError (currently NameError, with usual text)
> 
>    def f():
>      def g():
>        print x
>      g() # UnboundFreeVariableError (currently NameError, with specific text)
>      x = 1
> 
> Like UnboundLocalError, in both of these cases, the name is potentially known
> to the compiler - it simply hasn't been bound to anything yet.
> 

That was what I was thinking as the use case for UnboundGlobalError. 
Also, if you read the docs on NameError, it explicitly states that it
is for global names that are not found.

I am willing to toss in an exception for the failure to find a free
variable (although I would call it UnboundFreeError) to flesh this
namespace hierarchy out.

Then again you could argue you should inherit from each other since a
missing local is kind of lack missing the global namespace as well,
but that kind of purity just doesn't work for me in this case.

[rest of my response to this email is forthcoming]

-Brett


More information about the Python-Dev mailing list