[Python] Finding an error name

Martin Kelly aomighty at gmail.com
Thu Jul 6 22:09:03 PDT 2006


Okay... I haven't found a bug in python yet, but I guess I just found 
one. shelve works otherwise though... I've used it to save 10 or so 
variables, and it works correctly every time.

I thought anydbm.error was the error, but I could never catch it... I 
see now that the reason was that I hadn't imported anydbm. I just tried 
and that works though, so thanks.

I suppose I should submit a bug report now.

Martin

Bob Miller wrote:
> Martin Kelly wrote:
> 
>> I'm trying to figure out what error type is given by shelve.open(file, 
>> "r") when the file does not exist.
> 
> The exception type is an anydbm.error.  But I don't understand the
> source code.
> 
>>From anydbm.py:
> 
>     # ...
>     class error(Exception):
>         pass
>     # ...
>     error = tuple(_errors)
>     # ... line 77:
>         raise error, "need 'c' or 'n'..."
> 
> The Python Reference Manual doesn't say anything about using a tuple
> in a raise statement.
> 
>     http://docs.python.org/ref/raise.html
> 
> But that's what it is.  Here's a sample shell session.
> 
>     Python 2.4.3 (#1, Jun 28 2006, 06:34:30) 
>     [GCC 3.4.6 (Gentoo 3.4.6-r1, ssp-3.4.5-1.0, pie-8.7.9)] on linux2
>     Type "help", "copyright", "credits" or "license" for more information.
>     >>> import shelve
>     >>> import anydbm
>     >>> try:
>     ...     shelve.open('nonexistent', 'r')
>     ... except anydbm.error:
>     ...     print 'caught it'
>     ... 
>     caught it
>     Exception exceptions.AttributeError: "DbfilenameShelf instance has no
>     attribute 'writeback'" in  ignored
>     >>> anydbm.error
>     (<class anydbm.error at 0xb7f48bfc>,
>      <class bsddb._db.DBError at 0xb7f5623c>,
>      <class gdbm.error at 0xb7f48cbc>,
>      <class dbm.error at 0xb7f5b38c>,
>      <class exceptions.IOError at 0xb7f774ac>)
>     >>> 
> 
> So, uh, what's that weird other bit, exceptions.AttributeError?
> That's a bug in Python 2.4.3.  You can see in shelve.py that
> Shelf.__del__() calls Shelf.close() calls Shelf.sync() which
> references self.writeback even though that attribute doesn't exist.
> It also references self.dict which also doesn't exist.
> 
> My opinion is that if shelve is that poorly debugged, it's probably
> not ready for prime time.
> 
> Or you could submit a bug report...
> 


More information about the Python mailing list