Some subclasses of Exception are no longer pickleable in Python 2.5.  An
example:

class A(Exception):
        def __init__(self, foo):
                self.foo = foo

The key problem here is if you do not somehow set self.args to the correct
arguments (via Exception.__init__ or setting self.args directly), you will
get a TypeError when you try to unpickle it:

TypeError: __init__() takes exactly 2 arguments (1 given)

I do not think this is unusual.  I found a few examples in Python's
standard library that have this problem:

subprocess.CalledProcessError
HTMLParser.HTMLParseError
httplib.UnknownProtocol, httplib.IncompleteRead, httplib.BadStatusLine
optparse.OptParseError
pickle._Stop
and on and on...

Does anyone have any thoughts about this?  Is it a bug?

I can imagine one could argue that exceptions should call the base
__init__ method to properly set args, but there are so many exceptions out
there that do not do this that it would be very difficult to track them
all down.

I removed the __reduce__ and __setstate__ methods from BaseException and
everything seems to just work.  Pickling/unpickling works for all
protocols whether or not you set self.args.  Is this an appropriate
solution?  I'm not sure what the motivation for having these methods is.

-Eric
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to